Okta può agire come provider di identità per i workload emettendo token di accesso OIDC a una applicazione di servizio tramite il grant OAuth 2.0 client_credentials. Il tuo workload si autentica con Okta (tipicamente con private_key_jwt, così non viene memorizzato alcun segreto condiviso), riceve un "JSON Web Token" (token web JSON), o JWT, firmato e scambia quel JWT con Anthropic per ottenere un token di accesso di breve durata.
L'URL dell'issuer del server di autorizzazione Okta ha la forma https://<your-domain>.okta.com/oauth2/<auth-server-id>. Se utilizzi il server predefinito integrato, il percorso è /oauth2/default.
Devi utilizzare un server di autorizzazione personalizzato di Okta (incluso quello default). I token emessi direttamente dal server di autorizzazione dell'organizzazione Okta (l'endpoint /oauth2/v1/token senza ID del server di autorizzazione nel percorso) non possono essere validati da terze parti perché Okta non pubblica le chiavi di firma per essi.
Esistono molti modi per configurare e autenticarsi con Okta che esulano dall'ambito di questa documentazione. Assicurati che la tua configurazione e i tuoi meccanismi di autenticazione seguano le linee guida e le pratiche di sicurezza della tua azienda.
/v1/token di Okta e di raggiungere api.anthropic.com.A grandi linee devi:
La navigazione esatta dipende dalla configurazione della tua organizzazione Okta e dalla versione della console di amministrazione. I passaggi numerati di seguito illustrano un percorso comune:
private_key_jwt) e registra la JWK pubblica del tuo workload. In alternativa, usa un client secret se il tuo ambiente può memorizzarne uno in modo sicuro. Per l'esempio seguente potrebbe essere necessario disabilitare il requisito DPoP sull'applicazione; assicurati che la tua configurazione di produzione rispetti i requisiti di sicurezza della tua organizzazione.https://api.anthropic.com in modo che i token di accesso emessi contengano quel claim aud. Anthropic valida aud rispetto a questo valore fisso.anthropic.access). Okta rifiuta le richieste client_credentials che non includono uno scope concesso.Per un'app di servizio che utilizza client_credentials, Okta imposta il claim sub del token di accesso emesso sul Client ID dell'applicazione, e iss sull'URL dell'issuer del server di autorizzazione.
Segui la procedura di configurazione per registrare un issuer di federazione, creare un account di servizio Anthropic e creare una regola di federazione nella Claude Console. Usa questi valori specifici per Okta.
Issuer di federazione: Usa l'URL del tuo server di autorizzazione personalizzato Okta e la modalità discovery. Anthropic legge il documento di discovery .well-known/openid-configuration di Okta e recupera il JWKS dal jwks_uri che esso pubblica.
{
"name": "okta-prod",
"issuer_url": "https://acme.okta.com/oauth2/aus1a2b3c4d5e6f7g8h9",
"jwks_source": "discovery"
}Regola di federazione: Effettua il matching sul claim sub di Okta, che corrisponde al Client ID dell'app di servizio. Se hai definito claim personalizzati in Okta, puoi effettuare il matching su quelli invece, usando la mappa claims o una condition CEL.
{
"name": "okta-pipeline",
"issuer_id": "fdis_...",
"match": {
"subject_prefix": "0oa1b2c3d4e5f6g7h8i9",
"audience": "https://api.anthropic.com"
},
"target": { "type": "service_account", "service_account_id": "svac_..." },
"workspace_id": "wrkspc_...",
"oauth_scope": "workspace:developer",
"token_lifetime_seconds": 600
}A differenza dei provider nativi della piattaforma (AWS, Google Cloud, Kubernetes), che rendono disponibile un token all'interno del runtime del workload (tramite un file proiettato o un endpoint di metadati locale), Okta non lo fa. Il tuo workload deve chiamare l'endpoint token di Okta per ottenere un JWT, quindi passare quel JWT all'SDK Anthropic come token di identità.
Ogni scheda SDK mostra il pattern callable: l'SDK Anthropic richiama nuovamente il tuo provider di token di identità ogni volta che il token di accesso Anthropic si avvicina alla scadenza, quindi il tuo fetcher Okta dovrebbe restituire un token nuovo a ogni chiamata anziché memorizzarne uno nella cache a tempo indeterminato. La CLI ant rilegge ANTHROPIC_IDENTITY_TOKEN_FILE a ogni scambio, quindi aggiorna quel file con un timer per le shell a lunga esecuzione.
Uno scambio riuscito restituisce un access_token che inizia con sk-ant-oat01- e un valore expires_in in secondi. In caso di 400 invalid_grant, consulta Risolvere i problemi di uno scambio non riuscito; la causa più comune lato Okta è una mancata corrispondenza di issuer_url (deve includere il percorso /oauth2/<auth-server-id>; il server di autorizzazione dell'organizzazione Okta non è utilizzabile).
Più app di servizio sotto lo stesso server di autorizzazione Okta condividono lo stesso
issuer. Una regola che omette subject_prefix corrisponde a ogni app di servizio su quel
server, quindi qualsiasi team che possa registrarne una potrebbe ottenere un token Anthropic
federato.
Limita il blocco match della regola all'ambito più ristretto adatto al tuo caso d'uso:
subject_prefix sul Client ID completo dell'app di servizio senza * finale.audience che hai configurato sul server di autorizzazione, in modo che i token emessi per un audience diverso vengano rifiutati.claims della regola o una condition CEL.Was this page helpful?
import os
import httpx
import anthropic
from anthropic import WorkloadIdentityCredentials
def fetch_okta_token() -> str:
response = httpx.post(
f"{os.environ['OKTA_ISSUER']}/v1/token",
data={
"grant_type": "client_credentials",
"scope": "anthropic.access",
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
# Crea il JWT client_assertion RFC 7523 firmato con la chiave privata della tua app Okta
"client_assertion": build_signed_client_assertion(),
},
)
response.raise_for_status()
return response.json()["access_token"]
client = anthropic.Anthropic(
credentials=WorkloadIdentityCredentials(
identity_token_provider=fetch_okta_token,
federation_rule_id=os.environ["ANTHROPIC_FEDERATION_RULE_ID"],
organization_id=os.environ["ANTHROPIC_ORGANIZATION_ID"],
service_account_id=os.environ["ANTHROPIC_SERVICE_ACCOUNT_ID"],
workspace_id=os.environ.get("ANTHROPIC_WORKSPACE_ID"),
),
)
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(message.content[0].text)