Okta kann als Workload-Identity-Provider fungieren, indem es OIDC-Access-Tokens über den OAuth 2.0 client_credentials-Grant an eine Service Application ausstellt. Dein Workload authentifiziert sich bei Okta (typischerweise mit private_key_jwt, sodass kein gemeinsames Secret gespeichert wird), erhält ein signiertes JSON Web Token (JWT) und tauscht dieses JWT bei Anthropic gegen ein kurzlebiges Access-Token ein.
Die Issuer-URL des Okta-Authorization-Servers hat die Form https://<your-domain>.okta.com/oauth2/<auth-server-id>. Wenn du den integrierten Standard-Server verwendest, lautet der Pfad /oauth2/default.
Du musst einen Okta Custom Authorization Server verwenden (einschließlich des default-Servers). Tokens, die direkt vom Okta-Org-Authorization-Server ausgestellt werden (der /oauth2/v1/token-Endpunkt ohne Authorization-Server-ID im Pfad), können von externen Parteien nicht validiert werden, da Okta für diese keine Signaturschlüssel veröffentlicht.
Es gibt viele Möglichkeiten, Okta zu konfigurieren und sich bei Okta zu authentifizieren, die außerhalb des Umfangs dieser Dokumentation liegen. Stelle sicher, dass deine Konfigurations- und Authentifizierungsmechanismen den Richtlinien und Sicherheitspraktiken deines Unternehmens entsprechen.
/v1/token-Endpunkt von Okta anfordern und api.anthropic.com erreichen kann.Auf hoher Ebene musst du:
Die genaue Navigation hängt von der Konfiguration deiner Okta-Org und der Version der Admin Console ab. Die folgenden nummerierten Schritte führen durch einen gängigen Weg:
private_key_jwt) und registriere den öffentlichen JWK deines Workloads. Alternativ kannst du ein Client Secret verwenden, wenn deine Umgebung eines sicher speichern kann. Für das folgende Beispiel musst du möglicherweise die DPoP-Anforderung in der Anwendung deaktivieren; stelle sicher, dass dein Produktions-Setup den Sicherheitsanforderungen deiner Organisation entspricht.https://api.anthropic.com, damit ausgestellte Access-Tokens diesen aud-Claim tragen. Anthropic validiert aud gegen diesen festen Wert.anthropic.access). Okta lehnt client_credentials-Anfragen ab, die keinen gewährten Scope enthalten.Für eine Service App, die client_credentials verwendet, setzt Okta den sub-Claim des ausgestellten Access-Tokens auf die Client ID der Anwendung und iss auf die Issuer-URL des Authorization Servers.
Öffne in der Claude Console Settings → Workload identity, klicke auf Connect workload und wähle Custom OIDC. Der Assistent führt dich durch die Registrierung des Issuers, die Erstellung eines Service Accounts und die Erstellung einer Federation Rule.
Der Assistent erstellt diese Ressourcen für dich. Verwende die folgenden Werte, unabhängig davon, ob du sie im Assistenten eingibst oder an die Admin API sendest:
Federation Issuer: Verwende die URL deines Okta Custom Authorization Servers und den Discovery-Modus. Anthropic liest das .well-known/openid-configuration-Discovery-Dokument von Okta und ruft das JWKS von der dort angegebenen jwks_uri ab.
{
"name": "okta-prod",
"issuer_url": "https://acme.okta.com/oauth2/aus1a2b3c4d5e6f7g8h9",
"jwks": { "type": "discovery" }
}Federation Rule: Matche auf den Okta-sub-Claim, der die Client ID der Service App ist. Wenn du in Okta Custom Claims definiert hast, kannst du stattdessen mit der claims-Map oder einer CEL-condition auf diese matchen.
{
"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
}Anders als plattformnative Provider (AWS, Google Cloud, Kubernetes), die ein Token innerhalb der Laufzeitumgebung des Workloads verfügbar machen (über eine projizierte Datei oder einen lokalen Metadaten-Endpunkt), tut Okta dies nicht. Dein Workload muss den Token-Endpunkt von Okta aufrufen, um ein JWT zu erhalten, und dieses JWT dann als Identity-Token an das Anthropic SDK übergeben.
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",
# Erstelle das RFC 7523 client_assertion JWT, signiert mit dem privaten Schlüssel deiner Okta-App
"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"))Jeder SDK-Tab zeigt das Callable-Muster: Das Anthropic SDK ruft deinen Identity-Token-Provider erneut auf, wann immer das Anthropic-Access-Token sich dem Ablauf nähert. Dein Okta-Fetcher sollte daher bei jedem Aufruf ein frisches Token zurückgeben, anstatt eines unbegrenzt zu cachen. Die ant-CLI liest ANTHROPIC_IDENTITY_TOKEN_FILE bei jedem Austausch neu ein, also aktualisiere diese Datei bei lang laufenden Shells über einen Timer.
Ein erfolgreicher Austausch gibt ein access_token zurück, das mit sk-ant-oat01- beginnt, sowie einen expires_in-Wert in Sekunden. Bei 400 invalid_grant siehe Fehlerbehebung bei einem fehlgeschlagenen Austausch; die häufigste Ursache auf Okta-Seite ist eine nicht übereinstimmende issuer_url (sie muss den Pfad /oauth2/<auth-server-id> enthalten; der Okta-Org-Authorization-Server ist nicht verwendbar).
Mehrere Service Apps unter demselben Okta-Authorization-Server teilen sich
denselben Issuer. Eine Regel, die subject_prefix weglässt, matcht jede
Service App auf diesem Server, sodass jedes Team, das eine registrieren kann,
ein föderiertes Anthropic-Token erhalten könnte.
Beschränke den match-Block der Regel auf den engsten Umfang, der zu deinem Anwendungsfall passt:
subject_prefix auf die vollständige Client ID der Service App ohne abschließendes *.audience-Wert, den du auf dem Authorization Server konfiguriert hast, damit Tokens, die für eine andere Audience ausgestellt wurden, abgelehnt werden.claims-Map der Regel oder einer CEL-condition.Was this page helpful?