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 su Okta (tipicamente con private_key_jwt, quindi 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 a breve durata.
L'URL dell'issuer del server di autorizzazione Okta ha la forma https://<your-domain>.okta.com/oauth2/<auth-server-id>. Se usi il server predefinito integrato, il percorso è /oauth2/default.
Devi usare 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 parti esterne perché Okta non pubblica le chiavi di firma per essi.
Esistono molti modi per configurare e autenticarsi su Okta che esulano dall'ambito di questa documentazione. Assicurati che i tuoi meccanismi di configurazione e autenticazione seguano le linee guida e le pratiche di sicurezza della tua azienda.
/v1/token di Okta e raggiungere api.anthropic.com.Ad alto livello devi:
La navigazione esatta dipende dalla configurazione della tua organizzazione Okta e dalla versione della console di amministrazione. I seguenti passaggi numerati 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 usa 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.
Nella Claude Console, apri Settings → Workload identity, fai clic su Connect workload e seleziona Custom OIDC. La procedura guidata ti accompagna nella registrazione dell'issuer, nella creazione di un account di servizio e nella creazione di una regola di federazione.
La procedura guidata crea queste risorse per te. Usa i seguenti valori sia che tu li inserisca nella procedura guidata sia che li invii all'Admin API:
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 questo pubblicizza.
{
"name": "okta-prod",
"issuer_url": "https://acme.okta.com/oauth2/aus1a2b3c4d5e6f7g8h9",
"jwks": { "type": "discovery" }
}Regola di federazione: Effettua il match sul claim sub di Okta, che è il Client ID dell'app di servizio. Se hai definito claim personalizzati in Okta, puoi effettuare il match 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 delle piattaforme (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 dei token di Okta per ottenere un JWT, quindi passare quel JWT all'SDK di Anthropic come token di identità.
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",
# Costruisci 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-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(next(block.text for block in message.content if block.type == "text"))Ogni scheda dell'SDK mostra il pattern con callable: l'SDK di Anthropic richiama 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 invece di memorizzarne uno nella cache indefinitamente. 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 in grado di 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 diversa vengano rifiutati.claims della regola o una condition CEL.Was this page helpful?