Claude Platform Docs
管理認証

WIFリファレンス

Workload Identity Federationの環境変数、検証ルール、プロファイル設定、およびエラーリファレンス。

このページでは、Workload Identity Federationの設定項目、検証制約、およびエラーマッピングをまとめています。セットアップ手順については、プロバイダーガイドを参照してください。

トークン交換リクエスト

POST /v1/oauth/tokenは、RFC 7523jwt-bearerグラントを使用したJSONボディを受け付けます。SDKは環境変数からこのリクエストを自動的に構築します。各プロバイダーガイドのcURLの例では、生のボディを示しています。

フィールド必須説明
grant_typeはい常にurn:ietf:params:oauth:grant-type:jwt-bearerです。
assertionはいIDプロバイダーが発行したOIDC JWT。
federation_rule_idはい評価するフェデレーションルールのタグ付きID(fdrl_...)。
organization_idはいAnthropic組織のUUID。
service_account_idはい対象サービスアカウントのタグ付きID(svac_...)。
workspace_id条件付き発行されるトークンのスコープとなるワークスペースのタグ付きID(wrkspc_...)、または組織のデフォルトワークスペースを表すリテラルdefault。ルールが複数のワークスペースで有効になっている場合は必須です。省略した場合、サーバーはルールで唯一有効になっているワークスペースを選択します。

トークン交換レスポンス

POST /v1/oauth/tokenは、標準のOAuth 2.0トークンレスポンス(RFC 6749 §5.1)を返します。

フィールド説明
access_tokenstringsk-ant-oat01-...というプレフィックスが付いた短命のAnthropicトークン。Authorization: Bearer <token>として渡します。
token_typestring常にBearerです。
expires_inintegerトークンの有効期限が切れるまでの秒数。
scopestring一致したルールによって付与されたOAuthスコープ。

環境変数

SDKはこれらの変数を読み取り、コンストラクタ引数なしでフェデレーショントークン交換を実行します。

変数必須説明
ANTHROPIC_FEDERATION_RULE_IDはい評価するフェデレーションルールのタグ付きID。fdrl_...
ANTHROPIC_ORGANIZATION_IDはいAnthropic組織のUUID。Claude ConsoleのSettings > Organizationで確認できます。00000000-0000-0000-0000-000000000000
ANTHROPIC_IDENTITY_TOKEN_FILE_TOKEN_FILEまたは_TOKENのいずれかIDプロバイダー(IdP)が発行したJWTへのファイルシステムパス。SDKは交換のたびにこのファイルを再読み込みするため、ディスク上でローテーションされる投影トークンが常に最新の状態になります。/var/run/secrets/anthropic.com/token
ANTHROPIC_IDENTITY_TOKEN_TOKEN_FILEまたは_TOKENのいずれか文字列としてのリテラルJWT。プラットフォームがトークンをファイルではなく環境変数として注入する場合に使用します。eyJhbGciOiJSUzI1NiIs...
ANTHROPIC_SERVICE_ACCOUNT_IDはい発行されたアクセストークンが代理として動作する、対象のAnthropicサービスアカウントのタグ付きID。svac_...
ANTHROPIC_WORKSPACE_ID条件付き発行されるトークンのスコープとなるワークスペースのタグ付きID、またはリテラルdefault。フェデレーションルールが複数のワークスペースで有効になっている場合は必須、ルールが単一のワークスペースにバインドされている場合は任意です。発行されるトークンは交換時にこのワークスペースにスコープされるため、ワークスペースを切り替えるには新たな交換が必要です。wrkspc_...
ANTHROPIC_PROFILEいいえ読み込む設定プロファイルの名前。この表のフェデレーション環境変数よりも優先されます。staging-profile

環境変数による直接のフェデレーションパスは、ANTHROPIC_FEDERATION_RULE_IDANTHROPIC_ORGANIZATION_IDANTHROPIC_SERVICE_ACCOUNT_ID、およびANTHROPIC_IDENTITY_TOKEN_FILEまたはANTHROPIC_IDENTITY_TOKENのいずれかがすべて設定されている場合にのみ有効になります。ANTHROPIC_WORKSPACE_IDも併せて読み取られますが、有効化の条件にはなりません。

認証情報の優先順位

SDKは次の順序で認証情報を解決します。最初に認証情報を返したソースが採用されます。

順序ソース備考
1コンストラクタ引数(api_key=auth_token=credentials=常に他のすべてを上書きします。
2ANTHROPIC_API_KEYまたはANTHROPIC_AUTH_TOKENフェデレーションを完全に覆い隠します。APIキーから移行する際はこれらをunsetしてください。
3ANTHROPIC_PROFILE<config_dir>/configs/<name>.jsonを読み込みます。指定された名前のプロファイルが存在しない場合はエラーとなり、フォールスルーしません。
4フェデレーション環境変数ANTHROPIC_FEDERATION_RULE_ID + ANTHROPIC_ORGANIZATION_ID + ANTHROPIC_SERVICE_ACCOUNT_ID + ANTHROPIC_IDENTITY_TOKEN[_FILE]
5アクティブプロファイル<config_dir>/active_configから解決され、defaultという名前のプロファイルにフォールバックします。

プロファイルが読み込まれると、環境変数はプロファイルで省略されているフィールドを補完しますが、プロファイルで明示的に設定されているフィールドを上書きすることはありません。たとえば、ANTHROPIC_WORKSPACE_IDは、アクティブプロファイルがworkspace_idを設定していない場合にのみそれを補完します。

プロファイル設定ファイル

プロファイルとは、SDKとant CLIの両方が読み取る名前付き設定ファイルです。プロファイルを使用すると、フェデレーションパラメータをコンテナイメージに同梱したり、コードを変更せずに環境を切り替えたりできます。

設定ディレクトリ

SDKは次の順序で設定ディレクトリを探します。

  1. $ANTHROPIC_CONFIG_DIR
  2. LinuxおよびmacOSでは~/.config/anthropic
  3. Windowsでは%APPDATA%\Anthropic

アクティブプロファイル

アクティブプロファイル名は次の順序で解決されます。

  1. $ANTHROPIC_PROFILE
  2. <config_dir>/active_configの内容(ant profile activate <name>によって書き込まれる1行のファイル)
  3. リテラル名default

Claude CodeとClaude Agent SDKも同じ解決順序に従うため、ここで設定したフェデレーションプロファイルは、追加のセットアップなしでこれらのツールの認証にも使用されます。

ファイルレイアウト

パス内容機密性
<config_dir>/configs/<profile>.jsonversionauthenticationブロック、organization_idworkspace_id、およびbase_url非機密。コミットしたりイメージに組み込んだりしても安全です。
<config_dir>/credentials/<profile>.jsonversion、キャッシュされたaccess_tokenexpires_at、および(対話型ログインの場合)refresh_token機密。SDKによってモード0600で書き込まれます。

設定ファイルと認証情報ファイルの両方に、major.minor形式(現在は"1.0")のトップレベルの文字列フィールドversionがあります。SDKはこのフィールドを自動的に書き込むため、将来のリリースで古い形式を検出して移行できます。手動で設定を作成する場合は省略してかまいません。その場合、SDKはファイルを現在のバージョンとして扱います。

フェデレーションプロファイルの例

configs/production.json
{
  "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"
}

authentication.identity_tokenが省略されている場合、SDKは環境のANTHROPIC_IDENTITY_TOKEN_FILEまたはANTHROPIC_IDENTITY_TOKENにフォールバックします。

OAuthスコープ

フェデレーションルールに設定するoauth_scopeによって、発行されたアクセストークンが呼び出せるClaude APIエンドポイントが決まります。

スコープアクセスが付与される対象
workspace:developerルールのワークスペース内のすべての非管理系Claude APIエンドポイント:Messages(ストリーミングとトークンカウントを含む)、ModelsManaged Agentsとそのセッション、Files、およびSkills。これは、同じワークスペースのワークスペースAPIキーが持つアクセス権と一致します。
workspace:inferenceルールのワークスペース内の推論エンドポイント:Messages(ストリーミングとトークンカウントを含む)、Models、およびOpenAI互換チャットエンドポイント。Claudeを呼び出すだけでよく、Files、Skills、その他のリソースを管理する必要がないワークロードに使用します。
workspace:manage_tunnelsMCPトンネルAPI:トンネルの作成、一覧表示、取得、CA証明書の登録とアーカイブ、トンネルトークンの表示とローテーション、トンネルのアーカイブ。Consoleのトンネル作成モーダルウィンドウからルールを作成すると、このスコープに固定されます。
org:adminAdmin APIへのフルアクセス(組織メンバー、招待、ワークスペース、APIキーなど)。OAuthのorg:adminトークンは、workspace:developerまたはworkspace:inferenceにスコープされたルールのみを作成または変更でき、それ以外のスコープを持つルールの基盤となっている発行者を更新することはできません。制約を参照してください。

トークンのスコープ外のエンドポイントへのリクエストはHTTP 403を返します。より細かい粒度のスコープ(リソース単位、または読み取りと書き込みの区別)は現在利用できません。

権限の境界

フェデレーションルールのoauth_scopeは上限です。発行されたトークンがこれを超えることはありません。対象サービスアカウントのorganization_roledeveloperまたはadmin)によって付与可能なスコープが決まるため、org:adminを付与するルールはorganization_role=adminのサービスアカウントを対象とする必要があります。実効権限は、ルールのスコープとサービスアカウントのロールの共通部分です。

ルールのoauth_scopeサービスアカウントのorganization_role実効権限
workspace:developeradminルールのワークスペース内のClaude APIアクセスのみ。スコープによってトークンはロールより下に制限されます。
org:adminadminAdmin APIへのフルアクセス(組織メンバー、招待、ワークスペース、APIキーなど)。ただしOAuth呼び出し元に対する例外を除きます。制約を参照してください。

検証ルール

Anthropicは、発行者とルールの作成または更新時、および交換時に受信したJWTを検証する際に、これらの制約を適用します。

パラメータの詳細とレスポンススキーマについては、Service accounts APIリファレンスFederation issuers APIリファレンス、およびFederation rules APIリファレンスを参照してください。

リソースフィールド

フィールド制約
発行者、ルール、サービスアカウントのname^[a-z0-9-]+$に一致し、長さが1〜255文字である必要があります。
workspace_idapplies_to_all_workspacesがtrueでない限り、作成時に必須です。このルールの下で発行されるトークンにクォータ、請求、レート制限が適用されるワークスペース(wrkspc_...)。同じ組織内のワークスペースである必要があり、対象サービスアカウントはそのワークスペースのメンバーである必要があります。
applies_to_all_workspacesブール値。1つのワークスペースを指定する代わりに、組織内のすべてのワークスペースでルールを有効にするにはtrueに設定します。作成時にはこれかworkspace_idのいずれかが必須です。
token_lifetime_seconds60から86400(1分から24時間)の整数。デフォルトは3600。この範囲外の値はリクエスト時に拒否されます。トークンの有効期間と更新を参照してください。

URLフィールド

issuer_urljwks.discovery_base、およびjwks.urlフィールドは検証されます。

制約詳細
スキームhttpsである必要があります。
ポート443(明示的またはデフォルト)である必要があります。
ホストOIDCプロバイダーのパブリックDNSホスト名である必要があります。パブリックIPアドレスに解決される必要があり、IPリテラルは受け付けられません。

URL検証の失敗は400 invalid_request_errorを返し、エラーメッセージの先頭にフィールド名が付きます(例:issuer_url: url must use https scheme)。

JWT検証

制約詳細
最大サイズassertion JWTは最大16 KiBである必要があります。
署名アルゴリズム非対称アルゴリズム(RSAおよびECDSAファミリー:ES256、ES384、ES512、RS256、RS384、RS512、PS256、PS384、PS512)のみが受け付けられます。HMAC(HS256HS384HS512)およびnoneは拒否されます。
キーIDJWTヘッダーには、発行者のJWKS内のキーと一致するkidが含まれている必要があります。kidのないトークンは拒否されます。
必須クレームsubが存在する必要があります。iatが存在し、未来の時刻でない必要があります。expが存在し、未来の時刻である必要があります。
単回使用jtiクレームを持つアサーションは、発行者ごとに1回しか交換できません。同じjtiで交換を繰り返すとリプレイとして拒否されます。発行者のcheck_jtiフィールド(デフォルトで有効)がこのチェックを制御します。jtiクレームのないアサーションはこのチェックの対象外です。Federation issuers APIリファレンスを参照してください。
最大有効期間トークンの有効期間(expからiatを引いた値)は、発行者に設定された最大値(デフォルトで1時間、Claude Consoleで発行者ごとに設定可能)を超えてはなりません。
クロックスキューexpnbf、およびiatには30秒の許容範囲が適用されます。

ルールマッチングのセマンティクス

フェデレーションルールのmatchブロックは、受信したJWTを受け入れるかどうかを決定します。設定されているすべてのフィールドはANDセマンティクスで評価されます。つまり、JWTは設定されているすべてのマッチャーを満たす必要があります。subject_prefixclaims、またはconditionのうち少なくとも1つを設定する必要があります。audienceのみを含む(またはマッチャーをまったく含まない)matchブロックは拒否されます。これは、発行者からのすべてのトークンを受け入れてしまうルールを防ぐためです。

マッチャーセマンティクス
subject_prefixstringJWTのsubクレームとの完全一致。末尾に*を付けるとプレフィックス一致になります(subの値が*より前の文字で始まる必要があります)。大文字と小文字を区別します。
audiencestringJWTのaudクレームにこの文字列が正確に含まれている必要があります。audが配列の場合、いずれかの要素が正確に一致すればチェックを満たします。
claimsmap<string, string>各キーはトップレベルのクレーム名で、各値は必須の正確な文字列値です。ネストされたクレーム、数値、ブール値、またはリストやマップなどの複雑なクレームには、代わりにCEL式を使ったconditionを使用してください。
conditionstring (CEL)trueに評価される必要があるCEL式。

CEL評価環境

condition式は単一の変数にアクセスできます。

変数内容
claimsmapデコードされたJWTクレームセット全体。ネストされたオブジェクトはネストされたマップとしてアクセスできます。

例:

claims.sub.startsWith("repo:acme-corp/") && claims.ref in ["refs/heads/main", "refs/heads/release"]

エラー

トークン交換エラー

POST /v1/oauth/tokenは、標準のAPIエラー形式でエラーを返します。SDKは交換の失敗を型付きのFederationExchangeError(または各言語の同等物)でラップし、HTTPステータス、レスポンスボディ、およびrequest_idを公開します。

ステータスエラー原因解決方法
400invalid_request_errorfederation_rule_idの形式が不正、または必須のリクエストフィールドが欠落しています。fdrl_ IDと、リクエストボディにすべての必須フィールドが含まれていることを確認してください。
400invalid_request_errorworkspace_idが存在するものの、正しい形式のwrkspc_... IDでもリテラルdefaultでもありません。workspace_idの値を修正してください。レスポンスメッセージに期待される形式が示されます。
401authentication_errorJWTのissクレームが登録されたissuer_urlと正確に一致しません。末尾のスラッシュやスキームを含めてバイト単位で比較してください:jq -rR 'split(".")[1] | gsub("-";"+") | gsub("_";"/") | @base64d | fromjson | .iss' <<< "$JWT"
401authentication_errorJWKSの取得に失敗した、JWKSが古い、またはJWTがJWKSにないキーで署名されています。inlineモードの場合は、ローテーションされたキーで発行者を更新してください。discoveryおよびexplicit_urlの場合は、JWKSエンドポイントがポート443で到達可能であることを確認してください。発行者が最近署名キーをローテーションした場合は、キーのローテーションとキャッシュを参照してください。
401authentication_errorJWTのexpクレームが過去の時刻です(30秒のスキューウィンドウを超えています)。IDプロバイダーが新しいトークンを投影しており、SDKがトークンファイルを再読み込みしていることを確認してください。
401authentication_errorJWTは検証されましたが、そのクレームがルールのmatchブロックを満たしていません。JWTをデコードし、各クレームをルールと比較してください。subject_prefixは大文字と小文字を区別します。audienceは要素の完全一致が必要です。
401authentication_errorfederation_rule_idが存在しない、アーカイブされている、またはJWTがそのルールに対して認可されていません(列挙攻撃を防ぐために統合されています)。Claude ConsoleでルールIDを確認し、ルールがアーカイブされていないことを確認してください。
401authentication_errorフェデレーションルールが複数のワークスペースで有効になっており、リクエストでworkspace_idが省略されています。認証履歴のエントリには理由workspace_id_requiredが表示されます。ANTHROPIC_WORKSPACE_ID(または生のリクエストの場合はworkspace_idボディフィールド)を、トークンのスコープとしたいwrkspc_... IDに設定してください。トークン交換リクエストを参照してください。

アサーションの拒否はすべて、どのチェックが失敗したかに関係なく、固定メッセージAuthentication failedを持つ同一の不透明な401 authentication_errorを返します。区別可能なエラーを返すと、呼び出し元がルール設定を探ることができてしまうためです。拒否理由は認証履歴の該当試行のエントリに記録されます。たとえば、subクレームがルールのsubject_prefixを満たさない場合はmatch_subject_prefix、ルールが複数のワークスペースにまたがっていてリクエストがワークスペースを指定していない場合はworkspace_id_requiredとなります。ルールの組織が確認される前に拒否されたリクエスト(上記の400 invalid_request_errorファミリー)は履歴エントリを残しません。それらのレスポンスメッセージは問題を直接示します。一致する履歴エントリのない401は、通常federation_rule_id自体が認識されなかったことを意味します。

SDK側でよくある失敗

症状原因解決方法
SDKが交換を行わず「no credentials」と報告するANTHROPIC_FEDERATION_RULE_IDANTHROPIC_ORGANIZATION_IDANTHROPIC_SERVICE_ACCOUNT_ID、またはANTHROPIC_IDENTITY_TOKEN[_FILE]のいずれかが未設定で、アクティブなプロファイルもありません。4つの変数をすべて設定するか、プロファイルを設定してください。
SDKがフェデレーションではなくAPIキーで認証するANTHROPIC_API_KEYまたはANTHROPIC_AUTH_TOKENが設定されており、優先順位で勝っています。キーまたはトークンの変数をunsetしてください。
最初のリクエストでFileNotFoundErrorが発生するANTHROPIC_IDENTITY_TOKEN_FILEのパスが存在しません。SDKは交換時にファイルを遅延的に開きます。投影トークンのボリュームがマウントされており、パスが一致していることを確認してください。
トークン交換は成功するが、Claude APIリクエストが403を返す発行されたトークンのスコープがそのエンドポイントへのアクセスを付与していません。ルールのoauth_scopeOAuthスコープと照合してください。
空の認証情報で認証が失敗する認証情報の環境変数がエクスポートされているものの、空文字列に設定されています。空の値でも優先順位のスロットを占有します。VAR=""ではなくunset VARで変数をunsetしてください。

失敗した交換のトラブルシューティング

401 authentication_errorレスポンスは意図的に不透明であり、そのメッセージは常にAuthentication failedです。拒否理由はレスポンスではなく認証履歴に記録されます。

よくある不透明な失敗の1つは、リプレイされたアサーションです。jtiクレームを持つアサーションは1回しか交換できないため、同じJWTを再送信するワークロード(リトライループ、またはローテーションされていないトークンを再読み込みする更新処理)は2回目の交換で拒否されます。認証履歴ページにはこれらの試行が理由jti_reusedとともに表示されます。修正方法は、交換ごとに新しいアサーションを発行することです。

それでもJWT自体からデバッグする必要がある場合は、次のチェックを順番に実行してください。

  1. JWTをデコードする

    送信したアサーションをデコードして、各クレームを発行者およびルールの設定と比較できるようにします。

    cURL
    jq -rR 'split(".")[1] | gsub("-";"+") | gsub("_";"/") | @base64d | fromjson' <<< "$JWT"
  2. issが発行者と一致することを確認する

    デコードされたissクレームは、スキーム、ポート、末尾のスラッシュを含めて、登録されたissuer_urlとバイト単位で一致する必要があります。1文字でも不一致があると検証に失敗します。

  3. audがルールと一致することを確認する

    デコードされたaudクレームには、ルールのaudienceの値が完全一致で含まれている必要があります。audが配列の場合、いずれかの要素が正確に一致する必要があります。

  4. subと各claimsエントリを確認する

    subをルールのsubject_prefixと比較します(大文字と小文字を区別します。末尾の*はプレフィックス一致、それ以外は完全一致です)。ルールのclaimsマップ内のすべてのキーを、同名のトップレベルクレームと比較します。

  5. exp、nbf、iatを確認する

    expは未来の時刻、nbf/iatは過去の時刻である必要があり、30秒のスキューウィンドウ内である必要があります。ワークロードホストの時計がずれていると、それ以外は有効なトークンでも拒否されます。

  6. JWKSの到達可能性を確認する

    discoveryモードの場合は、<jwks.discovery_base or issuer_url>/.well-known/openid-configurationをポート443のパブリックHTTPS経由で取得し、jwks_uriが解決されることを確認します。explicit_urlの場合は、JWKS URLを直接取得します。inlineの場合は、キーを登録してから発行者の署名キーがローテーションされていないことを確認します。

    発行者が署名キーをローテーションしてすぐにそのキーで署名を開始した場合、AnthropicのJWKSキャッシュが更新されるまで最大1分間、交換が失敗する可能性があります。キーのローテーションとキャッシュを参照してください。

JWKSソースモード

フェデレーション発行者を登録する際、jwksフィールドは、その発行者からのJWT署名を検証するために使用する公開鍵をAnthropicがどのように取得するかを制御します。これはtypeをキーとする判別共用体です。

jwks.typejwksの形式動作使用する場面
discovery(デフォルト){ "type": "discovery", "discovery_base": "https://..." }discovery_baseは任意。ディスカバリーURLがissuer_urlと異なる場合に設定します)Anthropicは<discovery_base or issuer_url>/.well-known/openid-configurationを取得し、ディスカバリードキュメントからjwks_uriを読み取り、そこからJWKSを取得します。IdPがパブリックインターネット上で標準のOIDCディスカバリードキュメントを提供している場合。ほとんどのマネージドプロバイダー(EKS、GKE、Cloud Run、GitHub Actions、Entra ID)がこれをサポートしています。
explicit_url{ "type": "explicit_url", "url": "https://..." }AnthropicはurlからJWKSを直接取得します。issuer_urlはJWTのissクレームとの文字列比較にのみ使用され、接続されることはありません。IdPがディスカバリードキュメントを提供していない場合、またはディスカバリーは内部専用だがJWKSはパブリックに到達可能な場合。
inline{ "type": "inline", "keys": [...] }JWKオブジェクトの配列をインラインで指定します(ラッパーオブジェクトではなく、JWKSドキュメントのkeys配列)。Anthropicはアウトバウンドリクエストを行いません。issuer_urlissの比較にのみ使用されます。エアギャップ環境、クラスター内部の発行者URLを持つセルフマネージドKubernetesクラスター、またはキーのローテーションを明示的に制御したい場合。

判別共用体により、付随するフィールドは構造上相互に排他的になります。discoveryexplicit_urlはどちらも、プライベートCAからTLSを提供する発行者向けに、任意のca_cert_pem文字列も受け付けます。

キーのローテーションとキャッシュ

discoveryおよびexplicit_urlモードでは、Anthropicは取得したJWKSをキャッシュします。IDプロバイダーが新しい署名キーを公開してすぐにそのキーでトークンの署名を開始した場合、それらのトークンを提示する交換は、キャッシュが更新されるまで最大1分間、署名エラーで失敗する可能性があります。

このウィンドウを回避するには、IDプロバイダーが新しい署名キーでトークンの署名を開始する少なくとも15分前にそのキーをJWKSに公開し、置き換えられたキーは、それで署名されたトークンの有効期限が切れるまでJWKSに残しておいてください。マネージドIDプロバイダーは通常、この規律に自ら従っています。独自の発行者(セルフマネージドKubernetesクラスター、SPIRE OIDCディスカバリープロバイダー、またはローテーション周期が設定されたOktaカスタム認可サーバー)を運用している場合は、ローテーションポリシーが初回使用前に新しいキーを公開することを確認してください。

Was this page helpful?