WIF-Referenz
Umgebungsvariablen, Validierungsregeln, Profilkonfiguration und Fehlerreferenz für Workload Identity Federation.
Diese Seite sammelt die Konfigurationsoberflächen, Validierungseinschränkungen und Fehlerzuordnungen für Workload Identity Federation. Schritt-für-Schritt-Anleitungen zur Einrichtung findest du in den Anbieter-Leitfäden.
Token-Austausch-Anfrage
POST /v1/oauth/token akzeptiert einen JSON-Body, der den jwt-bearer-Grant aus RFC 7523 verwendet. Die SDKs erstellen diese Anfrage für dich aus den Umgebungsvariablen; die cURL-Beispiele in jedem Anbieter-Leitfaden zeigen den rohen Body.
| Feld | Erforderlich | Beschreibung |
|---|---|---|
grant_type | Ja | Immer urn:ietf:params:oauth:grant-type:jwt-bearer. |
assertion | Ja | Das von deinem Identitätsanbieter ausgestellte OIDC-JWT. |
federation_rule_id | Ja | Getaggte ID (fdrl_...) der auszuwertenden Federation-Regel. |
organization_id | Ja | UUID deiner Anthropic-Organisation. |
service_account_id | Ja | Getaggte ID (svac_...) des Ziel-Service-Accounts. |
workspace_id | Bedingt | Getaggte ID (wrkspc_...) des Workspace, auf den das ausgestellte Token beschränkt werden soll, oder das Literal default für den Standard-Workspace der Organisation. Erforderlich, wenn die Regel für mehr als einen Workspace aktiviert ist. Wenn weggelassen, wählt der Server den einzigen aktivierten Workspace der Regel. |
Token-Austausch-Antwort
POST /v1/oauth/token gibt eine Standard-OAuth-2.0-Token-Antwort zurück (RFC 6749 §5.1):
| Feld | Typ | Beschreibung |
|---|---|---|
access_token | string | Das kurzlebige Anthropic-Token mit dem Präfix sk-ant-oat01-.... Übergib es als Authorization: Bearer <token>. |
token_type | string | Immer Bearer. |
expires_in | integer | Sekunden bis zum Ablauf des Tokens. |
scope | string | Der von der übereinstimmenden Regel gewährte OAuth-Scope. |
Umgebungsvariablen
Das SDK liest diese Variablen, um einen föderierten Token-Austausch ohne Konstruktorargumente durchzuführen.
| Variable | Erforderlich | Beschreibung | Beispiel |
|---|---|---|---|
ANTHROPIC_FEDERATION_RULE_ID | Ja | Getaggte ID der auszuwertenden Federation-Regel. | fdrl_... |
ANTHROPIC_ORGANIZATION_ID | Ja | UUID deiner Anthropic-Organisation. Du findest sie in der Claude Console unter Settings > Organization. | 00000000-0000-0000-0000-000000000000 |
ANTHROPIC_IDENTITY_TOKEN_FILE | Eine von _TOKEN_FILE oder _TOKEN | Dateisystempfad zum JWT, das von deinem „identity provider“ (Identitätsanbieter), oder IdP, ausgestellt wurde. Das SDK liest diese Datei bei jedem Austausch erneut, sodass projizierte Token, die auf der Festplatte rotieren, immer aktuell sind. | /var/run/secrets/anthropic.com/token |
ANTHROPIC_IDENTITY_TOKEN | Eine von _TOKEN_FILE oder _TOKEN | Das JWT als literaler String. Verwende dies, wenn deine Plattform das Token als Umgebungsvariable statt als Datei injiziert. | eyJhbGciOiJSUzI1NiIs... |
ANTHROPIC_SERVICE_ACCOUNT_ID | Ja | Getaggte ID des Ziel-Service-Accounts von Anthropic, als der das ausgestellte Access-Token agiert. | svac_... |
ANTHROPIC_WORKSPACE_ID | Bedingt | Getaggte ID des Workspace, auf den das ausgestellte Token beschränkt werden soll, oder das Literal default. Erforderlich, wenn die Federation-Regel für mehr als einen Workspace aktiviert ist; optional, wenn die Regel an einen einzelnen Workspace gebunden ist. Das ausgestellte Token wird zum Zeitpunkt des Austauschs auf diesen Workspace beschränkt, sodass ein Wechsel des Workspace einen neuen Austausch erfordert. | wrkspc_... |
ANTHROPIC_PROFILE | Nein | Name eines zu ladenden Konfigurationsprofils. Hat Vorrang vor den Federation-Umgebungsvariablen in dieser Tabelle. | staging-profile |
Der direkte Federation-Pfad über Umgebungsvariablen wird nur aktiviert, wenn ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID und eine von ANTHROPIC_IDENTITY_TOKEN_FILE oder ANTHROPIC_IDENTITY_TOKEN alle gesetzt sind. ANTHROPIC_WORKSPACE_ID wird zusätzlich gelesen, steuert aber nicht die Aktivierung.
Rangfolge der Anmeldedaten
Das SDK löst Anmeldedaten in dieser Reihenfolge auf. Die erste Quelle, die Anmeldedaten liefert, gewinnt.
| Reihenfolge | Quelle | Hinweise |
|---|---|---|
| 1 | Konstruktorargument (api_key=, auth_token=, credentials=) | Überschreibt immer alles andere. |
| 2 | ANTHROPIC_API_KEY oder ANTHROPIC_AUTH_TOKEN | Überdeckt Federation vollständig. Entferne diese mit unset, wenn du von API-Keys migrierst. |
| 3 | ANTHROPIC_PROFILE | Lädt <config_dir>/configs/<name>.json. Ein fehlendes benanntes Profil ist ein Fehler, kein Durchfallen zur nächsten Quelle. |
| 4 | Federation-Umgebungsvariablen | ANTHROPIC_FEDERATION_RULE_ID + ANTHROPIC_ORGANIZATION_ID + ANTHROPIC_SERVICE_ACCOUNT_ID + ANTHROPIC_IDENTITY_TOKEN[_FILE]. |
| 5 | Aktives Profil | Aufgelöst aus <config_dir>/active_config, mit Fallback auf ein Profil namens default. |
Wenn ein Profil geladen wird, füllen Umgebungsvariablen alle Felder, die das Profil weglässt, überschreiben aber niemals Felder, die das Profil explizit setzt. Zum Beispiel füllt ANTHROPIC_WORKSPACE_ID das Feld workspace_id nur, wenn das aktive Profil es nicht setzt.
Profil-Konfigurationsdatei
Ein Profil ist eine benannte Konfigurationsdatei, die sowohl das SDK als auch die ant-CLI lesen. Mit Profilen kannst du Federation-Parameter mit deinem Container-Image ausliefern oder zwischen Umgebungen wechseln, ohne Code zu ändern.
Konfigurationsverzeichnis
Das SDK findet das Konfigurationsverzeichnis in dieser Reihenfolge:
$ANTHROPIC_CONFIG_DIR~/.config/anthropicunter Linux und macOS%APPDATA%\Anthropicunter Windows
Aktives Profil
Der Name des aktiven Profils wird in dieser Reihenfolge aufgelöst:
$ANTHROPIC_PROFILE- Der Inhalt von
<config_dir>/active_config(eine einzeilige Datei, die vonant profile activate <name>geschrieben wird) - Der literale Name
default
Claude Code und das Claude Agent SDK beachten dieselbe Auflösungsreihenfolge, sodass ein hier konfiguriertes Federation-Profil auch diese Tools ohne zusätzliche Einrichtung authentifiziert.
Dateilayout
| Pfad | Inhalt | Sensibilität |
|---|---|---|
<config_dir>/configs/<profile>.json | version, der authentication-Block, organization_id, workspace_id und base_url. | Nicht geheim. Kann sicher committet oder in ein Image eingebacken werden. |
<config_dir>/credentials/<profile>.json | version, das zwischengespeicherte access_token, expires_at und (bei interaktivem Login) refresh_token. | Geheim. Wird vom SDK mit Modus 0600 geschrieben. |
Sowohl die Konfigurationsdatei als auch die Anmeldedaten-Datei tragen ein String-Feld version auf oberster Ebene im Format major.minor (derzeit "1.0"). Das SDK schreibt dieses Feld automatisch, damit zukünftige Releases ältere Formate erkennen und migrieren können; lass es weg, wenn du eine Konfiguration von Hand erstellst, und das SDK behandelt die Datei als aktuelle Version.
Beispiel für ein Federation-Profil
{
"version": "1.0",
"authentication": {
"type": "oidc_federation",
"federation_rule_id": "fdrl_...",
"service_account_id": "svac_...",
"identity_token": {
"source": "file",
"path": "/var/run/secrets/anthropic.com/token"
}
},
"organization_id": "00000000-0000-0000-0000-000000000000",
"workspace_id": "wrkspc_...",
"base_url": "https://api.anthropic.com"
}Wenn authentication.identity_token weggelassen wird, fällt das SDK auf ANTHROPIC_IDENTITY_TOKEN_FILE oder ANTHROPIC_IDENTITY_TOKEN aus der Umgebung zurück.
OAuth-Scopes
Der oauth_scope, den du auf einer Federation-Regel setzt, bestimmt, welche Claude-API-Endpunkte das ausgestellte Access-Token aufrufen kann.
| Scope | Gewährt Zugriff auf |
|---|---|
workspace:developer | Alle nicht-administrativen Claude-API-Endpunkte im Workspace der Regel: Messages (einschließlich Streaming und Token-Zählung), Models, Managed Agents und deren Sessions, Files und Skills. Dies entspricht dem Zugriff, den ein Workspace-API-Key im selben Workspace hat. |
workspace:inference | Die Inferenz-Endpunkte im Workspace der Regel: Messages (einschließlich Streaming und Token-Zählung), Models und der OpenAI-kompatible Chat-Endpunkt. Verwende dies für Workloads, die nur Claude aufrufen müssen und niemals Files, Skills oder andere Ressourcen verwalten müssen. |
workspace:manage_tunnels | Die MCP-Tunnels-API: Tunnel erstellen, auflisten und abrufen, CA-Zertifikate registrieren und archivieren, das Tunnel-Token anzeigen und rotieren sowie Tunnel archivieren. Das Modalfenster zum Erstellen von Tunneln in der Console sperrt diesen Scope, wenn du darüber eine Regel erstellst. |
org:admin | Voller Zugriff auf die Admin API (Organisationsmitglieder, Einladungen, Workspaces, API-Keys und der Rest). Ein OAuth-org:admin-Token kann nur Regeln mit dem Scope workspace:developer oder workspace:inference erstellen oder ändern und kann keinen Issuer aktualisieren, der eine Regel mit einem anderen Scope stützt; siehe die Einschränkungen. |
Eine Anfrage an einen Endpunkt außerhalb des Token-Scopes gibt HTTP 403 zurück. Feinere Scopes (pro Ressource oder Lesen versus Schreiben) sind derzeit nicht verfügbar.
Berechtigungsgrenzen
Der oauth_scope einer Federation-Regel ist eine Obergrenze: Das ausgestellte Token kann ihn niemals überschreiten. Die organization_role des Ziel-Service-Accounts (developer oder admin) bestimmt, welche Scopes gewährt werden können, sodass eine Regel, die org:admin gewährt, auf einen Service-Account mit organization_role=admin zielen muss. Die effektiven Berechtigungen sind die Schnittmenge aus dem Scope der Regel und der Rolle des Service-Accounts.
oauth_scope der Regel | organization_role des Service-Accounts | Effektive Berechtigungen |
|---|---|---|
workspace:developer | admin | Claude-API-Zugriff nur im Workspace der Regel. Der Scope begrenzt das Token unterhalb der Rolle. |
org:admin | admin | Voller Admin-API-Zugriff (Organisationsmitglieder, Einladungen, Workspaces, API-Keys und der Rest), abzüglich der Ausnahmen für OAuth-Aufrufer; siehe Einschränkungen. |
Validierungsregeln
Anthropic erzwingt diese Einschränkungen, wenn du Issuer und Regeln erstellst oder aktualisierst und wenn ein eingehendes JWT zum Zeitpunkt des Austauschs verifiziert wird.
Vollständige Parameterdetails und Antwortschemata findest du in der Service-Accounts-API-Referenz, der Federation-Issuers-API-Referenz und der Federation-Rules-API-Referenz.
Ressourcenfelder
| Feld | Einschränkung |
|---|---|
name von Issuer, Regel und Service-Account | Muss ^[a-z0-9-]+$ entsprechen, Länge 1 bis 255 Zeichen. |
workspace_id | Beim Erstellen erforderlich, sofern applies_to_all_workspaces nicht true ist. Der Workspace (wrkspc_...), dessen Kontingent, Abrechnung und Ratenlimits für unter dieser Regel ausgestellte Token gelten. Muss ein Workspace in derselben Organisation sein, und der Ziel-Service-Account muss Mitglied dieses Workspace sein. |
applies_to_all_workspaces | Boolean. Setze true, um die Regel in jedem Workspace der Organisation zu aktivieren, anstatt einen zu benennen; beim Erstellen ist entweder dies oder workspace_id erforderlich. |
token_lifetime_seconds | Ganzzahl zwischen 60 und 86400 (1 Minute bis 24 Stunden). Standard 3600. Werte außerhalb dieses Bereichs werden zum Zeitpunkt der Anfrage abgelehnt. Siehe Token-Lebensdauer und Aktualisierung. |
URL-Felder
Die Felder issuer_url, jwks.discovery_base und jwks.url werden validiert:
| Einschränkung | Detail |
|---|---|
| Schema | Muss https sein. |
| Port | Muss 443 sein (explizit oder Standard). |
| Host | Muss ein öffentlicher DNS-Hostname für deinen OIDC-Anbieter sein. Muss zu öffentlichen IP-Adressen auflösen; IP-Literale werden nicht akzeptiert. |
Fehler bei der URL-Validierung geben 400 invalid_request_error zurück, mit dem Feldnamen als Präfix der Fehlermeldung (zum Beispiel issuer_url: url must use https scheme).
JWT-Verifizierung
| Einschränkung | Detail |
|---|---|
| Maximale Größe | Das assertion-JWT darf höchstens 16 KiB groß sein. |
| Signaturalgorithmus | Nur asymmetrische Algorithmen (RSA- und ECDSA-Familien: ES256, ES384, ES512, RS256, RS384, RS512, PS256, PS384, PS512) werden akzeptiert. HMAC (HS256, HS384, HS512) und none werden abgelehnt. |
| Key-ID | Der JWT-Header muss eine kid tragen, die mit einem Schlüssel im JWKS des Issuers übereinstimmt. Token ohne kid werden abgelehnt. |
| Erforderliche Claims | sub muss vorhanden sein. iat muss vorhanden sein und darf nicht in der Zukunft liegen. exp muss vorhanden sein und in der Zukunft liegen. |
| Einmalige Verwendung | Eine Assertion, die einen jti-Claim trägt, kann pro Issuer nur einmal ausgetauscht werden: Ein wiederholter Austausch mit derselben jti wird als Replay abgelehnt. Das Feld check_jti des Issuers (standardmäßig aktiviert) steuert diese Prüfung; Assertions ohne jti-Claim unterliegen ihr nicht. Siehe die Federation-Issuers-API-Referenz. |
| Maximale Lebensdauer | Die Lebensdauer des Tokens (exp minus iat) darf das konfigurierte Maximum des Issuers nicht überschreiten (standardmäßig 1 Stunde, für jeden Issuer in der Claude Console konfigurierbar). |
| Uhrenabweichung | Auf exp, nbf und iat wird ein Spielraum von 30 Sekunden angewendet. |
Semantik des Regelabgleichs
Der match-Block einer Federation-Regel bestimmt, ob ein eingehendes JWT akzeptiert wird. Alle befüllten Felder werden mit UND-Semantik ausgewertet: Das JWT muss jeden befüllten Matcher erfüllen. Mindestens eines von subject_prefix, claims oder condition muss gesetzt sein; ein match-Block, der nur audience (oder gar keine Matcher) enthält, wird abgelehnt. Dies schützt vor Regeln, die jedes Token eines Issuers akzeptieren würden.
| Matcher | Typ | Semantik |
|---|---|---|
subject_prefix | string | Exakte Übereinstimmung mit dem JWT-Claim sub. Ein abschließendes * macht daraus einen Präfix-Abgleich (der sub-Wert muss mit den Zeichen vor dem * beginnen). Groß-/Kleinschreibung wird beachtet. |
audience | string | Der JWT-Claim aud muss genau diesen String enthalten. Wenn aud ein Array ist, erfüllt jedes exakt übereinstimmende Element die Prüfung. |
claims | map<string, string> | Jeder Schlüssel ist ein Claim-Name auf oberster Ebene und jeder Wert ist der erforderliche exakte String-Wert. Für verschachtelte, numerische, boolesche oder komplexe Claims wie Listen und Maps verwende stattdessen condition mit einem CEL-Ausdruck. |
condition | string (CEL) | Ein CEL-Ausdruck, der zu true ausgewertet werden muss. |
CEL-Auswertungsumgebung
Der condition-Ausdruck hat Zugriff auf eine einzige Variable:
| Variable | Typ | Inhalt |
|---|---|---|
claims | map | Der vollständige dekodierte JWT-Claim-Satz. Verschachtelte Objekte sind als verschachtelte Maps zugänglich. |
Beispiel:
claims.sub.startsWith("repo:acme-corp/") && claims.ref in ["refs/heads/main", "refs/heads/release"]Fehler
Token-Austausch-Fehler
POST /v1/oauth/token gibt Fehler in der standardmäßigen API-Fehlerform zurück. Das SDK verpackt Austauschfehler in einen typisierten FederationExchangeError (oder das sprachspezifische Äquivalent), der den HTTP-Status, den Antwort-Body und die request_id bereitstellt.
| Status | Fehler | Ursache | Lösung |
|---|---|---|---|
| 400 | invalid_request_error | federation_rule_id ist fehlerhaft formatiert oder ein erforderliches Anfragefeld fehlt. | Überprüfe die fdrl_-ID und dass der Anfrage-Body alle erforderlichen Felder enthält. |
| 400 | invalid_request_error | workspace_id ist vorhanden, aber keine wohlgeformte wrkspc_...-ID oder das Literal default. | Korrigiere den workspace_id-Wert; die Antwortmeldung nennt das erwartete Format. |
| 401 | authentication_error | Der JWT-Claim iss entspricht nicht exakt der registrierten issuer_url. | Vergleiche Byte für Byte, einschließlich abschließender Schrägstriche und Schema: jq -rR 'split(".")[1] | gsub("-";"+") | gsub("_";"/") | @base64d | fromjson | .iss' <<< "$JWT". |
| 401 | authentication_error | JWKS-Abruf fehlgeschlagen, JWKS ist veraltet oder das JWT wurde mit einem Schlüssel signiert, der nicht im JWKS enthalten ist. | Aktualisiere im Modus inline den Issuer mit den rotierten Schlüsseln. Bestätige bei discovery und explicit_url, dass der JWKS-Endpunkt auf Port 443 erreichbar ist; wenn der Issuer kürzlich seinen Signaturschlüssel rotiert hat, siehe Schlüsselrotation und Caching. |
| 401 | authentication_error | Der JWT-Claim exp liegt in der Vergangenheit (außerhalb des 30-Sekunden-Abweichungsfensters). | Bestätige, dass dein Identitätsanbieter ein frisches Token projiziert und das SDK die Token-Datei erneut liest. |
| 401 | authentication_error | Das JWT wurde verifiziert, aber seine Claims erfüllen den match-Block der Regel nicht. | Dekodiere das JWT und vergleiche jeden Claim mit der Regel. subject_prefix beachtet Groß-/Kleinschreibung. audience erfordert eine exakte Elementübereinstimmung. |
| 401 | authentication_error | Die federation_rule_id existiert nicht, ist archiviert oder das JWT ist nicht dafür autorisiert (zusammengefasst, um Enumeration zu verhindern). | Bestätige die Regel-ID in der Claude Console und dass die Regel nicht archiviert wurde. |
| 401 | authentication_error | Die Federation-Regel ist für mehr als einen Workspace aktiviert und die Anfrage lässt workspace_id weg. Der Eintrag im Authentifizierungsverlauf zeigt den Grund workspace_id_required. | Setze ANTHROPIC_WORKSPACE_ID (oder das Body-Feld workspace_id bei einer rohen Anfrage) auf die wrkspc_...-ID, auf die das Token beschränkt werden soll. Siehe Token-Austausch-Anfrage. |
Jede Ablehnung einer Assertion gibt denselben undurchsichtigen 401 authentication_error mit der festen Meldung Authentication failed zurück, unabhängig davon, welche Prüfung fehlgeschlagen ist; ein unterscheidbarer Fehler würde es einem Aufrufer ermöglichen, die Regelkonfiguration auszuforschen. Der Ablehnungsgrund wird im Eintrag des Versuchs im Authentifizierungsverlauf aufgezeichnet, zum Beispiel match_subject_prefix, wenn der sub-Claim das subject_prefix der Regel nicht erfüllt, oder workspace_id_required, wenn die Regel mehrere Workspaces umfasst und die Anfrage keinen benennt. Anfragen, die abgelehnt werden, bevor die Organisation der Regel bestätigt ist (die obige Familie 400 invalid_request_error), hinterlassen keinen Verlaufseintrag; ihre Antwortmeldungen benennen das Problem direkt. Ein 401 ohne passenden Verlaufseintrag bedeutet in der Regel, dass die federation_rule_id selbst nicht erkannt wurde.
Häufige SDK-seitige Fehler
| Symptom | Ursache | Lösung |
|---|---|---|
| SDK meldet „no credentials“ statt einen Austausch durchzuführen | Eine von ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID oder ANTHROPIC_IDENTITY_TOKEN[_FILE] ist nicht gesetzt und kein Profil ist aktiv. | Setze alle vier Variablen oder konfiguriere ein Profil. |
| SDK authentifiziert sich mit einem API-Key statt zu föderieren | ANTHROPIC_API_KEY oder ANTHROPIC_AUTH_TOKEN ist gesetzt und gewinnt in der Rangfolge. | Entferne die Key- oder Token-Variable mit unset. |
FileNotFoundError bei der ersten Anfrage | Der Pfad in ANTHROPIC_IDENTITY_TOKEN_FILE existiert nicht. Das SDK öffnet die Datei erst zum Zeitpunkt des Austauschs. | Bestätige, dass das Volume mit dem projizierten Token eingehängt ist und der Pfad übereinstimmt. |
| Token-Austausch gelingt, aber eine Claude-API-Anfrage gibt 403 zurück | Der Scope des ausgestellten Tokens gewährt keinen Zugriff auf diesen Endpunkt. | Prüfe den oauth_scope der Regel anhand von OAuth-Scopes. |
| Authentifizierung schlägt mit leeren Anmeldedaten fehl | Eine Anmeldedaten-Umgebungsvariable ist exportiert, aber auf einen leeren String gesetzt. Leere Werte gewinnen dennoch ihren Platz in der Rangfolge. | Entferne die Variable mit unset VAR statt VAR="". |
Fehlerbehebung bei einem fehlgeschlagenen Austausch
Eine 401 authentication_error-Antwort ist absichtlich undurchsichtig und ihre Meldung lautet immer Authentication failed; der Ablehnungsgrund wird im Authentifizierungsverlauf aufgezeichnet, nicht in der Antwort.
Ein häufiger undurchsichtiger Fehler ist eine wiederholte Assertion: Eine Assertion, die einen jti-Claim trägt, kann nur einmal ausgetauscht werden, sodass ein Workload, der dasselbe JWT erneut sendet (eine Wiederholungsschleife oder eine Aktualisierung, die ein nicht rotiertes Token erneut liest), beim zweiten Austausch abgelehnt wird. Die Seite zum Authentifizierungsverlauf zeigt diese Versuche mit dem Grund jti_reused; die Lösung besteht darin, für jeden Austausch eine frische Assertion auszustellen.
Wenn du dennoch anhand des JWT selbst debuggen musst, arbeite diese Prüfungen der Reihe nach durch:
JWT dekodieren
Dekodiere die gesendete Assertion, damit du jeden Claim mit deiner Issuer- und Regelkonfiguration vergleichen kannst:
cURLjq -rR 'split(".")[1] | gsub("-";"+") | gsub("_";"/") | @base64d | fromjson' <<< "$JWT"Prüfen, ob iss mit dem Issuer übereinstimmt
Der dekodierte
iss-Claim muss Byte für Byte der registriertenissuer_urlentsprechen, einschließlich Schema, Port und eines eventuellen abschließenden Schrägstrichs. Eine Abweichung in einem einzigen Zeichen lässt die Verifizierung fehlschlagen.Prüfen, ob aud mit der Regel übereinstimmt
Der dekodierte
aud-Claim muss denaudience-Wert der Regel als exakte Übereinstimmung enthalten. Wennaudein Array ist, muss ein Element exakt übereinstimmen.sub und jeden claims-Eintrag prüfen
Vergleiche
submit demsubject_prefixder Regel (Groß-/Kleinschreibung wird beachtet; ein abschließendes*ist ein Präfix-Abgleich, alles andere ist exakt). Vergleiche jeden Schlüssel in derclaims-Map der Regel mit dem gleichnamigen Claim auf oberster Ebene.exp, nbf und iat prüfen
expmuss in der Zukunft liegen undnbf/iatmüssen in der Vergangenheit liegen, innerhalb des 30-Sekunden-Abweichungsfensters. Wenn die Uhr des Workload-Hosts abgewichen ist, wird ein ansonsten gültiges Token abgelehnt.JWKS-Erreichbarkeit prüfen
Rufe im Modus
discovery<jwks.discovery_base or issuer_url>/.well-known/openid-configurationüber öffentliches HTTPS auf Port 443 ab und bestätige, dassjwks_uriauflöst. Rufe beiexplicit_urldie JWKS-URL direkt ab. Bestätige beiinline, dass der Signaturschlüssel des Issuers seit der Registrierung der Schlüssel nicht rotiert wurde.Wenn der Issuer seinen Signaturschlüssel rotiert und sofort damit zu signieren begonnen hat, können Austausche bis zu einer Minute lang fehlschlagen, während der JWKS-Cache von Anthropic aktualisiert wird. Siehe Schlüsselrotation und Caching.
JWKS-Quellmodi
Wenn du einen Federation-Issuer registrierst, steuert das Feld jwks, wie Anthropic die öffentlichen Schlüssel bezieht, die zur Verifizierung von JWT-Signaturen dieses Issuers verwendet werden. Es ist eine diskriminierte Union mit type als Schlüssel:
jwks.type | jwks-Form | Verhalten | Verwenden, wenn |
|---|---|---|---|
discovery (Standard) | { "type": "discovery", "discovery_base": "https://..." } (discovery_base ist optional; setze es, wenn die Discovery-URL von issuer_url abweicht) | Anthropic ruft <discovery_base or issuer_url>/.well-known/openid-configuration ab, liest jwks_uri aus dem Discovery-Dokument und ruft das JWKS von dort ab. | Dein IdP stellt ein standardmäßiges OIDC-Discovery-Dokument im öffentlichen Internet bereit. Die meisten verwalteten Anbieter (EKS, GKE, Cloud Run, GitHub Actions, Entra ID) unterstützen dies. |
explicit_url | { "type": "explicit_url", "url": "https://..." } | Anthropic ruft das JWKS direkt von url ab. Die issuer_url wird nur für den String-Vergleich mit dem JWT-Claim iss verwendet und niemals aufgerufen. | Dein IdP stellt kein Discovery-Dokument bereit, oder Discovery ist nur intern verfügbar, das JWKS aber öffentlich erreichbar. |
inline | { "type": "inline", "keys": [...] } | Du lieferst das Array von JWK-Objekten inline (das keys-Array aus dem JWKS-Dokument, nicht das umschließende Objekt). Anthropic stellt keine ausgehende Anfrage. Die issuer_url wird nur für den iss-Vergleich verwendet. | Air-Gapped-Umgebungen, selbstverwaltete Kubernetes-Cluster mit clusterinternen Issuer-URLs oder wenn du explizite Kontrolle über die Schlüsselrotation möchtest. |
Die diskriminierte Union macht die Begleitfelder konstruktionsbedingt gegenseitig ausschließend. Sowohl discovery als auch explicit_url akzeptieren zusätzlich einen optionalen String ca_cert_pem für Issuer, die TLS von einer privaten CA bereitstellen.
Schlüsselrotation und Caching
In den Modi discovery und explicit_url speichert Anthropic das abgerufene JWKS im Cache. Wenn dein Identitätsanbieter einen neuen Signaturschlüssel veröffentlicht und sofort beginnt, Token damit zu signieren, können Austausche, die diese Token vorlegen, bis zu 1 Minute lang mit einem Signaturfehler fehlschlagen, während der Cache aktualisiert wird.
Um dieses Zeitfenster zu vermeiden, veröffentliche einen neuen Signaturschlüssel im JWKS mindestens 15 Minuten, bevor dein Identitätsanbieter beginnt, Token damit zu signieren, und behalte den abgelösten Schlüssel im JWKS, bis die damit signierten Token abgelaufen sind. Verwaltete Identitätsanbieter befolgen diese Disziplin in der Regel von selbst. Wenn du deinen eigenen Issuer betreibst (einen selbstverwalteten Kubernetes-Cluster, einen SPIRE-OIDC-Discovery-Provider oder einen benutzerdefinierten Okta-Autorisierungsserver mit konfiguriertem Rotationsrhythmus), bestätige, dass deine Rotationsrichtlinie neue Schlüssel vor der ersten Verwendung veröffentlicht.
Was this page helpful?