Azureワークロードは、Microsoft Entra IDが発行したJSON Web Token(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はテナントごとの発行者URLでOIDCディスカバリードキュメントを公開しているため、ディスカバリーモードを使用してください。フェデレーションする各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時間になるように発行します。これは、Azureが各リソースのトークンをその期間キャッシュし、早期リフレッシュを強制する方法を提供しないためです。発行者のデフォルトである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は、交換が返すAnthropicアクセストークンのライフタイムであり、Entraトークンのライフタイムではありません。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 Scale Set: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-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello from Azure"}],
)
print(next(block.text for block in message.content if block.type == "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の間が24時間ではなく、ランダムな60〜90分のウィンドウです。
Claude ConsoleでSettings → Workload identityを開き、Connect workloadをクリックしてMicrosoft Entraタイルを選択します。ウィザードが発行者の登録、サービスアカウントの作成、フェデレーションルールの作成を案内します。
ウィザードがこれらのリソースを作成します。ウィザードに入力する場合でも、Admin API に送信する場合でも、以下の値を使用してください。
フェデレーション発行者: ウィザードのToken issuerセレクターで**v2.0 (login.microsoftonline.com)**を選択します。(セレクターのデフォルトはv1です。このデフォルトは、v1.0トークンを発行し続ける古い登録を再利用しているテナントのために存在します。)Entraはテナントごとの発行者URLでOIDCディスカバリードキュメントを公開しているため、ディスカバリーモードを使用してください。フェデレーションする各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分のライフタイムをカバーします。テナントのトークンライフタイムポリシーまたは継続的アクセス評価(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は、交換が返すAnthropicアクセストークンのライフタイムであり、Entraトークンのライフタイムではありません。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はWebhookによって注入されるマネージドIDのクライアントIDで、呼び出し元を識別します。これらを取り違えないでください。
ワークロードがすでに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-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello from Azure"}],
)
print(next(block.text for block in message.content if block.type == "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?