Skip to main content
Gli ambienti self-hosted sono in beta pubblica sui piani Team ed Enterprise; un Owner li abilita attivando Allow self-hosted environments nella pagina di amministrazione Cloud environments. Questa pagina copre la verifica dell’identità della sessione; consultare la guida rapida per la configurazione e Deploy to production per le ricette della flotta.
Un ambiente self-hosted consente alle sessioni di Claude Code sul web di eseguirsi su infrastrutture che voi gestite invece che su quelle di Anthropic. Poiché la sessione viene eseguita all’interno della vostra rete, Claude può chiamare direttamente i vostri servizi interni. Questi servizi hanno bisogno di un modo per confermare che una richiesta proviene da una sessione Claude Code nel vostro ambiente e per identificare l’identità dell’utente o del servizio che ha creato quella sessione. Ogni sessione in un ambiente self-hosted riceve un JSON Web Token (JWT) firmato nella variabile di ambiente CLAUDE_CODE_SESSION_ACCESS_TOKEN. Una sessione presenta il token come qualsiasi credenziale bearer; ad esempio, uno script che Claude esegue può chiamare il vostro servizio con curl -H "Authorization: Bearer $CLAUDE_CODE_SESSION_ACCESS_TOKEN". Anthropic firma il token e pubblica le chiavi di verifica in un endpoint JWKS pubblico. I vostri servizi recuperano quelle chiavi, verificano la firma e leggono i claim per decidere quale accesso concedere.

Il token della sessione

Prima di scrivere il codice di verifica, sapete cosa stabilisce il token e la forma che la vostra libreria JWT vedrà.

Cosa prova il token

Un token valido stabilisce alcuni fatti e deliberatamente non altri:
  • Prova: Anthropic ha emesso il token per una sessione specifica in un ambiente specifico e come è stata creata la sessione: da un utente nella vostra organizzazione, o dall’identità del servizio della vostra organizzazione, che è come iniziano le sessioni del canale Claude Tag
  • Non prova: quale processo sull’host del runner lo presenta. Il token si trova in una variabile di ambiente all’interno della sessione, quindi qualsiasi codice che Claude esegue e qualsiasi tool o server MCP che la sessione avvia può leggerlo e presentarlo.
Due conseguenze per i vostri servizi:
  • Verificate il claim aud rispetto all’ID del vostro ambiente, il valore ccpool_... mostrato con il vostro ambiente nella pagina di amministrazione Cloud environments, per rifiutare i token emessi per l’ambiente di qualsiasi altra organizzazione.
  • Limitate le credenziali che derivate dal token a quello che una singola sessione di codifica dovrebbe essere in grado di fare, non a tutto quello che il creatore della sessione può fare. Consultare Scope derived credentials.

Formato del token

Il valore di CLAUDE_CODE_SESSION_ACCESS_TOKEN ha un prefisso sk-ant-cc- seguito da un JWT standard a tre parti:
Rimuovete il prefisso prima di passare il valore a una libreria JWT. I token emessi per le sessioni cloud ospitate da Anthropic portano invece un prefisso sk-ant-si- e sono firmati da un diverso set di chiavi, quindi rifiutate qualsiasi valore che non inizi con sk-ant-cc-. L’algoritmo di firma è ES256, che è ECDSA sulla curva P-256 con SHA-256. L’intestazione del token porta un kid che identifica quale chiave nel JWKS lo ha firmato.

Verificare il token

La verifica viene eseguita in uno di due posti. I servizi sulla vostra rete verificano il token crittograficamente rispetto alle chiavi pubblicate da Anthropic, e gli script wrapper all’interno della sessione possono invece utilizzare il decoder integrato del binario del runner.

Verificare il token dal vostro servizio

Anthropic pubblica le chiavi di verifica in un endpoint pubblico e non autenticato:
La risposta è un JSON Web Key Set standard. Anthropic ruota periodicamente le chiavi di firma e le chiavi precedenti a una rotazione rimangono nel set abbastanza a lungo affinché i token che hanno firmato continuino a verificarsi, quindi non fissate una singola chiave. L’endpoint imposta Cache-Control: public, max-age=300, quindi memorizzare nella cache il set di chiavi e recuperarlo ogni cinque minuti è sicuro. Verificate ogni token in arrivo rispetto a questi controlli:
1

Controllare il prefisso

Rifiutate il valore se non inizia con sk-ant-cc-, quindi rimuovete quel prefisso. Il resto è un JWT compatto standard.
2

Verificare la firma

Recuperate il JWKS, selezionate la chiave il cui kid corrisponde all’intestazione del token e verificate la firma ES256. Rifiutate i token il cui header alg non è ES256. Se un token arriva con un kid che non è nel vostro set di chiavi memorizzato nella cache, recuperate il JWKS una volta prima di rifiutarlo: dopo una rotazione, i nuovi token sono firmati con una chiave che il vostro set memorizzato nella cache non ha ancora.
3

Verificare l'emittente

Rifiutate il token se iss non è esattamente ccr.
4

Verificare il pubblico rispetto al vostro ambiente

Il claim aud è un array. Rifiutate il token a meno che non contenga l’ID del vostro ambiente, che ha la forma ccpool_.... L’ID dell’ambiente è mostrato nella finestra di dialogo dei dettagli del vostro ambiente nella pagina di amministrazione Cloud environments e appare come il claim ccr:pool_id in qualsiasi token di sessione dell’ambiente. Questo controllo è quello che limita il token al vostro ambiente e rifiuta i token emessi per altre organizzazioni.
5

Verificare il ruolo

Rifiutate il token se ccr:role non è esattamente session_worker. Altri token emessi per ambienti self-hosted, come i segreti dell’ambiente, i token del runner e gli ordini di lavoro, sono firmati dallo stesso set di chiavi ma portano ruoli diversi.
6

Verificare la scadenza

Rifiutate il token se exp è nel passato. Anthropic emette i token di sessione con una durata di vita di quattro ore per impostazione predefinita e un massimo di otto ore. Il runner aggiorna il token prima della scadenza e invia il nuovo valore alla sessione, quindi i sottoprocessi che Claude avvia dopo un aggiornamento lo ereditano. Una sessione può quindi presentare diversi token validi distinti al vostro servizio nel corso della sua durata.
7

Leggere l'identità

L’identità dell’utente che crea è nel claim act: act.sub è il suo ID utente Anthropic nella forma con prefisso user:<id> e act.email, quando la superficie di creazione ne ha registrato uno, è il suo indirizzo email. Le sessioni che l’identità del servizio della vostra organizzazione crea, incluse le sessioni del canale Claude Tag, portano invece un soggetto agent:, quindi trattate una sessione come creata dall’utente solo quando act.sub porta il prefisso user:, piuttosto che testare se i claim di identità sono assenti. Consultare il riferimento dei claim per la struttura completa e i claim duplicati piatti.
I controlli si mappano direttamente sulle librerie JWT standard. Gli esempi seguenti implementano la sequenza completa in Node.js con jose, che gestisce il recupero JWKS, la memorizzazione nella cache e la selezione di kid, e in Python con PyJWT e il suo client JWKS integrato.

Verificare il token all’interno della sessione

Gli script wrapper vengono eseguiti all’interno della sessione, prima che Claude inizi. Invece di chiamare una libreria JWT, possono eseguire il sottocomando self-hosted-runner decode-token del binario del runner. Il sottocomando legge il token da un argomento posizionale, da CLAUDE_CODE_SESSION_ACCESS_TOKEN o da stdin piped, in quell’ordine, quindi rimuove il prefisso, verifica la firma rispetto all’endpoint JWKS, controlla la scadenza e stampa i claim come JSON. Il sottocomando esegue solo i controlli di firma e scadenza; non controlla iss, aud o ccr:role. Quando la decisione di autenticazione del vostro wrapper dipende da questi claim, leggete i claim dal JSON stampato e confrontateli esplicitamente. Questo comando estrae l’identità del creatore, preferendo il soggetto del provider SSO, quindi l’indirizzo email, quindi il soggetto act.sub del creatore, user:<id> o agent:<id>:
I wrapper ricevono il percorso assoluto al binario del runner stesso in CLAUDE_RUNNER_CLAUDE_BIN; utilizzate quel percorso piuttosto che un claude risolto da PATH in modo che la decodifica venga eseguita sullo stesso binario che il runner stesso utilizza. Utilizzate jq -re piuttosto che jq -r in modo che un claim mancante causi un’uscita diversa da zero. Con solo -r, un claim mancante stampa la stringa letterale null e esce con zero, il che passa silenziosamente un valore errato a valle. Passate --no-verify a decode-token solo per l’ispezione offline dove l’endpoint JWKS è irraggiungibile.

Riferimento dei claim

La tabella seguente elenca i claim del token di sessione rilevanti per la verifica. Leggete l’identità dallo spazio dei nomi ccr:* e dalla catena act; i claim piatti account_email, organization_uuid e account_uuid sono duplicati di compatibilità all’indietro che potrebbero essere rimossi. Le sessioni che l’identità del servizio della vostra organizzazione crea, incluse le sessioni del canale Claude Tag, portano un soggetto agent: in act.sub e omettono act.email, ccr:account_id, account_email e account_uuid. I due claim di email sono facoltativi anche per le sessioni create dall’utente: Anthropic li registra al momento della creazione della sessione solo quando le credenziali della richiesta di creazione portano un’email, e una sessione inviata dalla CLI può mancare di entrambi, quindi basate l’identità su act.sub o ccr:account_id piuttosto che su email. I token possono anche portare claim aggiuntivi oltre questa tabella; ignorate i claim che non riconoscete.

La catena act

Il claim act registra il percorso di delega completo dall’identità dell’utente o del servizio che ha creato la sessione fino all’ambiente il cui segreto ha ammesso il runner e l’identità che ha creato quel segreto. Il creatore è l’attore più esterno, quindi act.sub li identifica direttamente.

Scope derived credentials

Il token di sessione identifica l’utente o l’identità del servizio che ha creato la sessione, ma non lo trattate come equivalente a quel creatore che accede direttamente. Il token si trova in una variabile di ambiente all’interno della sessione, quindi qualsiasi codice che Claude esegue e qualsiasi tool o server MCP che la sessione avvia può leggerlo e presentarlo. La verifica è anche offline: un token che verifica rispetto al JWKS rimane valido fino al suo exp, qualunque cosa sia accaduta alla sessione da allora, e Anthropic non pubblica un feed di revoca per i token di sessione. Limitate qualsiasi cosa deriviate dal token di conseguenza. Quando il vostro servizio scambia il token per credenziali interne, emettete credenziali limitate a quello che una sessione di codifica dovrebbe raggiungere:
  • Limitate le capacità: concedete accesso in lettura e scrittura alle risorse di cui la sessione ha bisogno per i compiti di codifica, non alle capacità amministrative che il creatore detiene altrove.
  • Limitate la durata: limitate le credenziali derivate al exp del token, o più breve.
  • Controllate come la sessione: registrate ccr:session_id e jti insieme all’identità del creatore in modo da poter tracciare le azioni di nuovo a una sessione specifica.
L’identità del creatore appare anche in variabili di ambiente semplici su due superfici che non verificano mai il token:
  • L’hook spawn-runner, sull’orchestratore: l’hook viene eseguito prima che esista un runner per una sessione in coda e riceve l’identità del creatore in variabili come CLAUDE_RUNNER_ACCOUNT_EMAIL e CLAUDE_RUNNER_ACCOUNT_ID. L’orchestratore le legge dall’ordine di lavoro, il token firmato monouso che autorizza l’avvio di un runner, senza verificare la firma dell’ordine di lavoro stesso; i claim sono attendibili perché l’ordine di lavoro arriva sulla connessione dell’orchestratore ad Anthropic, che il segreto dell’ambiente autentica.
  • Script wrapper, all’interno della sessione: i wrapper ricevono CCR_SESSION_ACCOUNT_EMAIL, l’email del creatore pre-estratta dal token senza verifica della firma. La variabile è adatta per l’etichettatura, come i trailer di commit, non per le decisioni di autenticazione.
Utilizzate le variabili semplici per le decisioni lato orchestratore come la selezione di un’immagine di macchina. Utilizzate CLAUDE_CODE_SESSION_ACCESS_TOKEN quando un servizio a valle ha bisogno di una prova crittografica indipendente piuttosto che fidarsi dell’ambiente del runner.

Cosa c’è dopo