Azureワークロードは、Microsoft Entra IDによって発行された「JSON Web Token」(JSONウェブトークン)、すなわちJWTを提示し、それを短期間有効なAnthropicアクセストークンと交換することでClaude APIに対して認証を行います。セットアップはすべてのAzureプラットフォームで同じ構成に従います。
POST /v1/oauth/tokenでsk-ant-oat01-...形式のAnthropicアクセストークンと交換し、それを使用してClaudeを呼び出します。どちらのパスでも、Anthropicに提示するトークンにはテナント固有のEntra発行者と、subおよびoidクレームにマネージドIDのオブジェクトIDが含まれます。異なるのはワークロードがそのトークンを取得する方法だけです。ワークロードが実行される場所に応じてセクションを選択してください。VM、VM Scale Sets、App Service、Functions、Container Appsの場合はマネージドIDを使用する、AKSの場合はAKSでEntra Workload Identityを使用するを参照してください。
Microsoft Entra IDは、リクエストされたオーディエンスがサービスプリンシパルを持つアプリ登録としてテナント内に存在する場合にのみトークンを発行します。Claude APIオーディエンスを表す1つのアプリ登録を作成してください。テナント内のすべてのワークロードがこれに対してトークンをリクエストできます。この登録がないと、トークンリクエストは「resource not found in tenant」エラー(マネージドIDエンドポイントからはAADSTS50001、EntraトークンエンドポイントからはAADSTS500011)で失敗します。
# Claude APIオーディエンスを表すアプリ登録を作成します。
APP_ID=$(az ad app create --display-name claude-api-federation --query appId -o tsv)
# v2.0アクセストークンを要求し、api://<APP_ID>識別子URIを設定します。
az ad app update --id "$APP_ID" \
--identifier-uris "api://$APP_ID" \
--set api.requestedAccessTokenVersion=2
# テナント内でオーディエンスが解決されるようにサービスプリンシパルを作成します。
az ad sp create --id "$APP_ID"api://<APP_ID>形式の識別子URIを使用してください。Entraはhttps://識別子URIを自身のテナントの検証済みドメインに制限しているため、https://api.anthropic.comのようなURIはほとんどのテナントで登録できません。api://<APP_ID>はどこでも受け入れられます。requestedAccessTokenVersion: 2を設定すると、このオーディエンスのトークンはv2.0になります。このガイドはこれを前提としています。v1.0トークンを発行する既存の登録を再利用する場合は、トークンがv1.0の場合を参照してください。
ワークロードがVM、VM Scale Set、App Service、Functions、またはContainer Appsで実行される場合は、このパスを使用します。ワークロードは、割り当てられたマネージドIDのEntra発行JWTをプラットフォームのローカルトークンエンドポイントからリクエストし、そのJWTをAnthropicと交換します。
マネージドIDをアタッチする
Azureリソースでシステム割り当てまたはユーザー割り当てマネージドIDを有効にします。Azureポータルでリソースを開き、IDに移動してシステム割り当てをオンにします(またはユーザー割り当てIDをアタッチします)。
IDが作成されたら、そのオブジェクト(プリンシパル)IDをメモしてください。このGUIDは発行されたトークンのsubとoidの両方のクレームとして表示され、Anthropicフェデレーションルールはこれに一致します。リソースのIDページで確認できます。ユーザー割り当てIDの場合は、マネージドIDリソースの概要ページにあるオブジェクト(プリンシパル)IDです。(マネージドIDはMicrosoft Entra IDにサービスプリンシパルのみを持ち、アプリ登録は持ちません。)
プラットフォームのトークンエンドポイントを確認する
IDがアタッチされると、プラットフォームはローカルトークンエンドポイントを公開します。
http://169.254.169.254/metadata/identity/oauth2/tokenのIMDSで、ヘッダーMetadata: trueとapi-version=2018-02-01を使用します。IDENTITY_ENDPOINTのURLで、ヘッダーX-IDENTITY-HEADERをIDENTITY_HEADERの値に設定し、api-version=2019-08-01を使用します。これらのプラットフォームではIMDSに到達できません。リソースに複数のユーザー割り当てマネージドIDがある場合は、トークンリクエストにclient_id=<IDENTITY_CLIENT_ID>を追加して1つを選択します。Azureは常にこれを指定することを推奨しています。指定しない場合、結果はリソースにシステム割り当てIDも有効になっているかどうかによって異なります。有効になっている場合、リクエストは暗黙的にそのIDにフォールバックし、フェデレーションルールのoid一致に失敗します。有効になっていない場合、2つ目のユーザー割り当てIDがアタッチされた時点でリクエストは即座に失敗します。
サンプルトークンをデコードする
エンドポイントからトークンをリクエストし、そのペイロードをデコードして、フェデレーションルールが一致する必要があるクレームを確認します。(デコードコマンドについては、失敗した交換のトラブルシューティングを参照してください。)マネージドIDのv2.0トークンには次のクレームが含まれます。
{
"iss": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"sub": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"aud": "<APP_ID>",
"oid": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"tid": "<TENANT_ID>",
"azp": "<IDENTITY_CLIENT_ID>",
"ver": "2.0",
"exp": 1775527120
}| クレーム | 値 | これに一致させる場合 |
|---|---|---|
oid | マネージドIDのオブジェクトID。subと同一 | 特定の1つのマネージドIDを認可したい場合。これがデフォルトです。Anthropicを設定するのルールはこれに一致します。 |
azp | 呼び出し元IDのクライアントID | 1つのアプリ登録を共有するすべてのワークロードを認可したい場合。マネージドIDの場合、azpはそのIDに固有であるため、oidと同等です。 |
aud | オーディエンスアプリ登録のクライアントID(トークンオーディエンスを登録するの<APP_ID> GUID) | 常に。ルールのaudienceフィールドはトークンのaud値と正確に一致する必要があります。 |
tid | テナントID | 多層防御を行いたい場合。発行者URLはすでにテナントを固定しています。 |
デコードされたトークンのverクレームが1.0の場合、クレーム名と値が異なります。続行する前にトークンがv1.0の場合を参照してください。
Claude ConsoleでSettings → Workload identityを開き、Connect workloadをクリックしてMicrosoft Entraタイルを選択します。ウィザードが発行者の登録、サービスアカウントの作成、フェデレーションルールの作成を案内します。
ウィザードがこれらのリソースを作成します。ウィザードに入力する場合でも、Admin API に送信する場合でも、以下の値を使用してください。
フェデレーション発行者: ウィザードのToken issuerセレクターで**v2.0 (login.microsoftonline.com)**を選択します。(セレクターのデフォルトはv1です。このデフォルトは、v1.0トークンをまだ発行する古い登録を再利用するテナント向けに存在します。)EntraはテナントごとのOIDCディスカバリドキュメントを発行者URLで公開しているため、ディスカバリモードを使用します。フェデレーションする各Microsoft Entraテナントには独自の発行者レコードが必要です。
{
"name": "azure-prod-tenant",
"issuer_url": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"jwks": { "type": "discovery" },
"max_jwt_lifetime_seconds": 86400
}マネージドIDワークロードにはmax_jwt_lifetime_seconds: 86400が必要です。Azureは各リソースのトークンをそのウィンドウでキャッシュし、早期リフレッシュを強制する方法を提供しないため、マネージドIDトークンをiatとexpの間が最大24時間で発行します。発行者の1時間のデフォルトではこれらのトークンはinvalid_grantで拒否されます。Connect workloadウィザードのMicrosoft Entraタイルはmax_jwt_lifetime_secondsを7500に設定して発行者を作成し、作成時にこれを変更するフィールドを提供しないため、ウィザードを完了してからSettings → Workload identity → Issuersを開き、発行者を編集して値を86400に引き上げてください。Admin APIを通じて発行者を更新することもできます。
受け入れられる有効期間が長いほど、漏洩したEntraトークンが交換可能な期間が長くなります。トークンが漏洩した場合、対処手段はフェデレーションルールを無効にすることです。ルールのスコープを設定するで説明されているように、厳密なoid一致により、そもそもトークンを交換できるIDが制限されます。
フェデレーションルール: マネージドIDのオブジェクトIDとテナントIDに一致させます。このガイドで設定するv2.0トークンの場合、audience値はオーディエンスアプリ登録のクライアントID(トークンオーディエンスを登録するの<APP_ID> GUID)です。デコードしたトークンの正確なaud値を使用してください。
{
"name": "azure-inference-worker",
"issuer_id": "fdis_...",
"match": {
"audience": "<APP_ID>",
"claims": {
"oid": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"tid": "<TENANT_ID>"
}
},
"target": {
"type": "service_account",
"service_account_id": "svac_..."
},
"workspace_id": "wrkspc_...",
"oauth_scope": "workspace:developer",
"token_lifetime_seconds": 600
}token_lifetime_secondsは、Entraトークンではなく、交換が返すAnthropicアクセストークンの有効期間です。SDKが自動的にリフレッシュします。
実行時にワークロードはEntraトークンを取得し、POST /v1/oauth/tokenで交換し、返されたベアラートークンを使用してClaudeを呼び出します。次の例に示すように、トークンプロバイダーのcallableを指定すると、各Anthropic SDKが交換とリフレッシュループを処理します。cURLタブは生のフローを示しています。
サンプルは、プラットフォームのトークンエンドポイント(VMおよびVM Scale SetsではIMDS、App Service、Functions、Container AppsではIDENTITY_ENDPOINTサービス)からマネージドIDトークンを取得します。api://<APP_ID>リソース値の<APP_ID>を、トークンオーディエンスを登録するのオーディエンスアプリ登録のクライアントIDに置き換えてください。
ワークロードがすでにAzure Identityクライアントライブラリを使用している場合は、トークンエンドポイントを直接呼び出す代わりに、そのトークン取得(スコープapi://<APP_ID>/.defaultを指定したDefaultAzureCredential)をIDトークンプロバイダーとして渡してください。ライブラリは、Entra Workload Identityを使用するAKSを含むすべてのAzureプラットフォームで正しいエンドポイントを選択します。
import os
import anthropic
import requests
from anthropic import WorkloadIdentityCredentials
# オーディエンスアプリ登録の識別子URI(「トークンオーディエンスを登録する」を参照)。
AUDIENCE = "api://<APP_ID>"
def fetch_entra_token() -> str:
"""Fetch a managed identity token from the platform's token endpoint."""
# ユーザー割り当てIDが複数ある場合は、リクエストパラメータに client_id=<IDENTITY_CLIENT_ID> を
# 追加して1つを選択します。
if endpoint := os.environ.get("IDENTITY_ENDPOINT"):
# App Service、Functions、Container Apps
response = requests.get(
endpoint,
headers={"X-IDENTITY-HEADER": os.environ["IDENTITY_HEADER"]},
params={"api-version": "2019-08-01", "resource": AUDIENCE},
timeout=5,
)
else:
# VMまたはVMスケールセット: Azure Instance Metadata Service (IMDS)
response = requests.get(
"http://169.254.169.254/metadata/identity/oauth2/token",
headers={"Metadata": "true"},
params={"api-version": "2018-02-01", "resource": AUDIENCE},
timeout=5,
)
response.raise_for_status()
return response.json()["access_token"]
client = anthropic.Anthropic(
credentials=WorkloadIdentityCredentials(
identity_token_provider=fetch_entra_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 from Azure"}],
)
print(message.content[0].text)Azureリソースから、トークンを取得して使用するに示されているcURL交換を実行し、POST /v1/oauth/tokenがsk-ant-oat01-で始まるaccess_tokenと秒単位のexpires_in値を含む200を返すことを確認します。400 invalid_grantの場合は、Entraトークンをデコードし(コマンドについては失敗した交換のトラブルシューティングを参照)、最も一般的なAzure側の原因を確認してください。
issuer_urlはトークンのissクレームと正確に一致する必要があります。v2.0トークンはhttps://login.microsoftonline.com/<TENANT_ID>/v2.0を含みます。デコードされたverクレームが1.0の場合は、トークンがv1.0の場合を参照してください。iatとexpの間が最大24時間です。発行者がまだウィザードの7500(または1時間のデフォルト)のままの場合は、Anthropicを設定するで説明されているようにmax_jwt_lifetime_secondsを86400に引き上げてください。audienceはトークンのaudと正確に一致する必要があります。このガイドで設定するv2.0トークンの場合、これはオーディエンスアプリ登録のクライアントIDです。azpではなくappidに含みます。トークンがv1.0の場合を参照してください。ワークロードがAKSポッドで実行される場合は、このパスを使用します。Entra Workload IdentityはKubernetesサービスアカウントをユーザー割り当てマネージドIDとフェデレーションします。Kubernetesはサービスアカウントトークン(AKSクラスターのOIDC発行者によって署名されたもの)をAZURE_FEDERATED_TOKEN_FILEのパスでポッドにプロジェクトします。そのプロジェクトされたトークンはEntra発行のトークンではないため、このページで説明されているEntra経由のパスを維持するには、ワークロードは2ホップの交換を実行します。まず、プロジェクトされたトークンをhttps://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token(フェデレーションclient_credentialsグラント)でEntra発行のアクセストークンと引き換え、次にそのEntraトークンをIDトークンとしてAnthropic SDKに渡します。
AKSポッドは、代わりにEntra交換をスキップして、KubernetesがプロジェクトしたサービスアカウントトークンをAnthropicに直接提示することもできます。そのパスでは、Entraテナントの代わりにAKSクラスターのOIDC発行者をAnthropicに登録します。そのフローについてはKubernetesでWIFを使用するを参照してください。
クラスターでOIDC発行者とワークロードIDを有効にする
ワークロードIDを有効にすると、azure-workload-identityミューテーティングWebhookが自動的にインストールされます。AKS以外のクラスターでのみ手動でデプロイしてください。後の手順で作成するフェデレーション資格情報のために、クラスターのOIDC発行者URLを取得します。
az aks update \
--resource-group <RESOURCE_GROUP> \
--name <CLUSTER_NAME> \
--enable-oidc-issuer \
--enable-workload-identity
AKS_OIDC_ISSUER=$(az aks show \
--resource-group <RESOURCE_GROUP> \
--name <CLUSTER_NAME> \
--query oidcIssuerProfile.issuerUrl -o tsv)ユーザー割り当てマネージドIDを作成する
IDから2つの値を取得します。クライアントIDはサービスアカウントアノテーションに入り(ポッドにAZURE_CLIENT_IDとして注入されます)、オブジェクト(プリンシパル)IDはAnthropicフェデレーションルールが一致するoidクレームとして表示されます。
az identity create \
--resource-group <RESOURCE_GROUP> \
--name claude-inference-identity \
--location <LOCATION>
# サービスアカウントのアノテーションに設定され、AZURE_CLIENT_ID としてポッドに注入されます。
IDENTITY_CLIENT_ID=$(az identity show \
--resource-group <RESOURCE_GROUP> \
--name claude-inference-identity \
--query clientId -o tsv)
# フェデレーションルールが照合する oid クレームとして表示されます。
IDENTITY_OBJECT_ID=$(az identity show \
--resource-group <RESOURCE_GROUP> \
--name claude-inference-identity \
--query principalId -o tsv)アノテーション付きKubernetesサービスアカウントを作成する
azure-workload-identity Webhookはazure.workload.identity/client-idアノテーションを読み取り、AZURE_CLIENT_IDをポッドに注入します。トークンを取得して使用するのサンプルはこれを環境から読み取ります。
apiVersion: v1
kind: ServiceAccount
metadata:
name: claude-inference
namespace: inference
annotations:
azure.workload.identity/client-id: <IDENTITY_CLIENT_ID>マネージドIDにフェデレーション資格情報を作成する
フェデレーション資格情報は、その特定のサービスアカウントに対してクラスターのOIDC発行者を信頼します。--audience api://AzureADTokenExchange値は、受信するKubernetesサービスアカウントトークンに対するEntraの固定オーディエンスです。これは先ほど登録したClaude APIオーディエンスとは無関係です。
az identity federated-credential create \
--resource-group <RESOURCE_GROUP> \
--identity-name claude-inference-identity \
--name claude-inference-aks \
--issuer "$AKS_OIDC_ISSUER" \
--subject system:serviceaccount:inference:claude-inference \
--audience api://AzureADTokenExchangeポッドにラベルを付けてサービスアカウントを設定する
ポッドはazure.workload.identity/use: "true"ラベルを持ち、アノテーション付きサービスアカウントとして実行される必要があります。WebhookはAZURE_FEDERATED_TOKEN_FILE、AZURE_CLIENT_ID、AZURE_TENANT_IDをポッドに注入します。AZURE_FEDERATED_TOKEN_FILEのファイルには、AKSクラスターのOIDC発行者によって署名された、Kubernetesがプロジェクトしたサービスアカウントトークンが含まれています。
apiVersion: v1
kind: Pod
metadata:
name: inference-worker
namespace: inference
labels:
azure.workload.identity/use: "true"
spec:
serviceAccountName: claude-inference
containers:
- name: app
image: your-registry/inference-worker:latestサンプルトークンをデコードする
Anthropicフェデレーションルールが見るトークンはプロジェクトされたファイルではなく、client_credentials交換によって返されるEntra発行のトークンです。ラベル付きポッド内から、トークンを取得して使用するのcURLサンプルのステップ1を実行し、結果をデコードします。マネージドIDパスと同じクレーム構造を持ちます。
{
"iss": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"sub": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"aud": "<APP_ID>",
"oid": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"tid": "<TENANT_ID>",
"azp": "<IDENTITY_CLIENT_ID>",
"ver": "2.0",
"exp": 1775527120
}subとoidはマネージドIDのオブジェクトID、audはオーディエンスアプリ登録のクライアントID、azpはマネージドIDのクライアントID(AZURE_CLIENT_IDの値)です。有効期間はマネージドIDパスとは異なります。client_credentialsトークンは、iatとexpの間がデフォルトで60〜90分のランダムなウィンドウであり、24時間ではありません。
Claude ConsoleでSettings → Workload identityを開き、Connect workloadをクリックしてMicrosoft Entraタイルを選択します。ウィザードが発行者の登録、サービスアカウントの作成、フェデレーションルールの作成を案内します。
ウィザードがこれらのリソースを作成します。ウィザードに入力する場合でも、Admin API に送信する場合でも、以下の値を使用してください。
フェデレーション発行者: ウィザードのToken issuerセレクターで**v2.0 (login.microsoftonline.com)**を選択します。(セレクターのデフォルトはv1です。このデフォルトは、v1.0トークンをまだ発行する古い登録を再利用するテナント向けに存在します。)EntraはテナントごとのOIDCディスカバリドキュメントを発行者URLで公開しているため、ディスカバリモードを使用します。フェデレーションする各Microsoft Entraテナントには独自の発行者レコードが必要です。
{
"name": "azure-prod-tenant",
"issuer_url": "https://login.microsoftonline.com/<TENANT_ID>/v2.0",
"jwks": { "type": "discovery" },
"max_jwt_lifetime_seconds": 7500
}Connect workloadウィザードのMicrosoft Entraタイルはmax_jwt_lifetime_secondsを7500(2時間強)に設定して発行者を作成します。これはclient_credentialsトークンのデフォルトの60〜90分の有効期間をカバーします。テナントのトークン有効期間ポリシーまたは「Continuous Access Evaluation」(継続的アクセス評価)、すなわちCAEがその有効期間を延長する可能性があります。デコードしたトークンのexpからiatを引いた値が7500秒を超える場合は、Settings → Workload identity → Issuersで発行者を編集し、max_jwt_lifetime_secondsをそれに合わせて引き上げてください。そうしないと交換はinvalid_grantで失敗します。テナントがマネージドIDを使用するのマネージドIDワークロードも実行している場合は、そのセクションの86400値を使用してください。これは両方のパスをカバーします。
受け入れられる有効期間が長いほど、漏洩したEntraトークンが交換可能な期間が長くなります。トークンが漏洩した場合、対処手段はフェデレーションルールを無効にすることです。ルールのスコープを設定するで説明されているように、厳密なoid一致により、そもそもトークンを交換できるIDが制限されます。
フェデレーションルール: マネージドIDのオブジェクトIDとテナントIDに一致させます。このガイドで設定するv2.0トークンの場合、audience値はオーディエンスアプリ登録のクライアントID(トークンオーディエンスを登録するの<APP_ID> GUID)です。デコードしたトークンの正確なaud値を使用してください。
{
"name": "azure-inference-worker",
"issuer_id": "fdis_...",
"match": {
"audience": "<APP_ID>",
"claims": {
"oid": "9f8e7d6c-1a2b-3c4d-5e6f-...",
"tid": "<TENANT_ID>"
}
},
"target": {
"type": "service_account",
"service_account_id": "svac_..."
},
"workspace_id": "wrkspc_...",
"oauth_scope": "workspace:developer",
"token_lifetime_seconds": 600
}token_lifetime_secondsは、Entraトークンではなく、交換が返すAnthropicアクセストークンの有効期間です。SDKが自動的にリフレッシュします。
実行時にポッドは2ホップの交換を実行します。Kubernetesがプロジェクトしたトークン(AZURE_FEDERATED_TOKEN_FILEのファイル)をフェデレーションclient_credentialsアサーションとしてEntraのトークンエンドポイントに送信し、次に結果のEntraアクセストークンをPOST /v1/oauth/tokenで交換します。次の例に示すように、Entra取得をトークンプロバイダーのcallableとして指定すると、各Anthropic SDKが2番目の交換とリフレッシュループを処理します。cURLタブは生のフローを示しています。
サンプルには2つの異なるクライアントIDが表示されます。<APP_ID>はトークンオーディエンスを登録するのオーディエンスアプリ登録のクライアントIDです。スコープapi://<APP_ID>/.defaultは、そのオーディエンス宛てのトークンをEntraにリクエストします。$AZURE_CLIENT_IDはマネージドIDのクライアントIDで、Webhookによって注入され、呼び出し元を識別します。一方を他方に置き換えないでください。
ワークロードがすでにAzure Identityクライアントライブラリを使用している場合は、2ホップの交換を自分で実行する代わりに、そのトークン取得(スコープapi://<APP_ID>/.defaultを指定したDefaultAzureCredential)をIDトークンプロバイダーとして渡してください。ライブラリは同じAZURE_FEDERATED_TOKEN_FILE、AZURE_CLIENT_ID、AZURE_TENANT_ID環境変数を読み取り、Entra交換を処理します。
import os
from pathlib import Path
import anthropic
import requests
from anthropic import WorkloadIdentityCredentials
def fetch_entra_token_via_federation() -> str:
federated_token = Path(os.environ["AZURE_FEDERATED_TOKEN_FILE"]).read_text()
response = requests.post(
f"https://login.microsoftonline.com/{os.environ['AZURE_TENANT_ID']}/oauth2/v2.0/token",
data={
"client_id": os.environ["AZURE_CLIENT_ID"],
"grant_type": "client_credentials",
"scope": "api://<APP_ID>/.default",
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
"client_assertion": federated_token,
},
timeout=5,
)
response.raise_for_status()
return response.json()["access_token"]
client = anthropic.Anthropic(
credentials=WorkloadIdentityCredentials(
identity_token_provider=fetch_entra_token_via_federation,
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 from Azure"}],
)
print(message.content[0].text)ラベル付きポッド内から、トークンを取得して使用するに示されているcURL交換を実行し、POST /v1/oauth/tokenがsk-ant-oat01-で始まるaccess_tokenと秒単位のexpires_in値を含む200を返すことを確認します。400 invalid_grantの場合は、ステップ1のEntra発行トークンをデコードし(コマンドについては失敗した交換のトラブルシューティングを参照)、最も一般的なAzure側の原因を確認してください。
issuer_urlはトークンのissクレームと正確に一致する必要があります。v2.0トークンはhttps://login.microsoftonline.com/<TENANT_ID>/v2.0を含みます。デコードされたverクレームが1.0の場合は、トークンがv1.0の場合を参照してください。client_credentialsトークンを7500秒を超えて延長する場合は、Anthropicを設定するで説明されているように発行者のmax_jwt_lifetime_secondsを引き上げてください。audienceはトークンのaudと正確に一致する必要があります。このガイドで設定するv2.0トークンの場合、これはオーディエンスアプリ登録のクライアントIDです。azpではなくappidに含みます。トークンがv1.0の場合を参照してください。このガイドではオーディエンスアプリ登録をapi.requestedAccessTokenVersion: 2で設定しているため、示されるすべてのトークンはv2.0です。requestedAccessTokenVersionを未設定のままにしている既存の登録を再利用する場合、Entraは代わりにv1.0トークンを発行します。サンプルトークンをデコードしてそのverクレームを確認してください。1.0の場合、4つの点が変わります。
issクレームはhttps://login.microsoftonline.com/<TENANT_ID>/v2.0ではなくhttps://sts.windows.net/<TENANT_ID>/です。トークンのissクレームに含まれるとおりに発行者URLを正確に登録してください。2つのURLは同じJWKSを共有しているため、ディスカバリモードはどちらでも機能します。audクレームは、登録のクライアントIDではなく、resourceとして渡した識別子URI(例:api://<APP_ID>)です。フェデレーションルールのaudienceをデコードしたトークンの正確なaud値に設定してください。azpではなくappidに表示されます。2つのクレームが同じトークンに表示されることはないため、azpに一致するルールはv1.0トークンに対して決して通過しません。oid、sub、tidクレームは両方のバージョンで同じ値を持つため、このガイドの残りの部分は変更なしで適用されます。
フェデレーションルールは、claimsマップに加えて(または代わりに)subject_prefixでトークンのサブジェクトに一致させることができます。フィールドの組み合わせ方についてはルール一致のセマンティクスを参照してください。これらのIDのEntra sub値は固定長の正規GUIDであるため、完全な36文字のオブジェクトIDを含むsubject_prefixはそのサブジェクトにのみ一致します。これはEntraのサブジェクト形式の特性であり、subject_prefix一般の特性ではありません。
テナント内のすべてのIDが登録されたオーディエンスに対してトークンをリクエストできるため、
audienceとtidだけでは特定のワークロードを識別できません。oid(またはazp/appid)
の一致を省略するルール、またはワイルドカードや部分的なGUIDのsubject_prefixを使用する
ルールは、テナント内のすべてのマネージドIDとサービスプリンシパルを認可します。
ルールのmatchブロックをユースケースに適合する最も狭いスコープにロックしてください。
oidを正確な値として一致させる: claims.oidをマネージドIDの完全なオブジェクトIDに設定します。その完全なオブジェクトIDに設定されたsubject_prefixは同等です(Consoleウィザードは両方を設定します)。ワイルドカードや部分的なGUIDのsubject_prefixは決して使用しないでください。意図したよりも多くのIDに一致します。tidを固定する: 発行者URLはすでにテナントを固定していますが、claims.tidを追加することで、発行者レコードが後で編集された場合の設定ドリフトを防ぎます。audienceをデコードしたトークンの正確なaud値に設定し、他のアプリケーション用に発行されたトークンが拒否されるようにします。Was this page helpful?