- Client Credentials Flow: アプリケーションは自身の代理として動作し、自身として認証されます。リクエストがユーザーによって開始された場合でも、そのコンテキストは失われます。ダウンストリームサービスが認識できるのは、呼び出し元アプリケーションのIDだけです。
- On-Behalf-Of (OBO) Token Exchange: アプリケーションはユーザーにスコープが付与されたトークンを受け取り、それを新しいトークンに交換してダウンストリームサービスを呼び出せます。これにより、元のエンドユーザーのIDとコンテキストが呼び出しチェーン全体で保持されます。
- 元のユーザーのIDと権限を維持する
- Service B 用に特化したスコープが設定されている
- Service B がエンドユーザーに基づいて認可の判断を行えるようにする
post-login Action トリガーが実行されます。ここで:
event.transaction.protocolはoauth2-token-exchangeに設定されます。event.transaction.actorは完全な委譲チェーンを追跡します。
Auth0 for AI Agents アドオンを購入すると、OBO token exchange に対して、ご利用中のサブスクリプションティアにおける Authentication API の最大レート制限を使用できます。たとえば、Private Cloud 100 RPS を利用している場合、OBO token exchange の 30 RPS というレート制限を超えて、OBO token exchange リクエストに対して最大 100 RPS の容量を利用できます。Authentication API の制限は共有されており、ログイン、トークンの更新、トークン交換を含む、すべての Authentication API リクエストを合算した全体の上限として機能します。詳細については、Technical Account Manager にお問い合わせください。
ユースケース
- ユーザーに代わってファーストパーティ API を呼び出す必要がある MCP サーバー
- ユーザーに代わってダウンストリームサービスを呼び出す必要があるマイクロサービス
仕組み
例: MCPサーバーがファーストパーティAPIを呼び出す
ステップ 1: ユーザー認証
ステップ 2: OBO 交換
act クレーム
act (actor) クレーム は、委譲チェーン全体を追跡します。各 act レベルは呼び出しチェーン内のサービスを表し、最も外側の act.sub は、token exchange を実行した現在のアクターを識別します。
この例では:
- 最も外側の
act.sub:mcp_server_client_id(直前に token exchange を行った MCP サーバー) - ネストされた
act.sub:spa_client_id(元のクライアントアプリケーション)
azp クレーム は最も外側の act.sub の値と一致し、直近で token exchange を実行したサービスを示す必要があります。
ファーストパーティ API が別のダウンストリームサービス (https://calendar-api.acme.com) を呼び出す場合、委譲チェーンはさらに延びます:
act のネストが4段階ある場合、OBO トークン交換は失敗します。
API呼び出しのたびに新しいトークンを要求するのではなく、アクセストークンは有効期限が切れるまでキャッシュして使ってください。アクセストークンは有効期限内であれば再利用できるため、トークン交換を繰り返すと、リソースの無駄遣いになり、待ち時間が増え、レート制限にかかるおそれがあります。
User > MCPサーバー > API フロー
- ユーザー認証: ユーザーはクライアントアプリケーションで認証を行います。Auth0 Authorization Server は、MCP サーバー向けのscopeを持つ Token A を発行します。
- 最初のリクエスト: クライアントアプリケーションは MCP Server を呼び出し、
Authorization: Bearerヘッダーで Token A を渡します。 - 検証とトークン交換: MCP サーバーは Token A を受け取り、検証したうえで、Auth0 Authorization Server の
/oauth/tokenエンドポイントに渡します。OBO token exchange を使用して、MCP サーバーはsubject_tokenとして Token A を提示し、ファーストパーティ API 用の新しい token をリクエストします。 - トークン発行: Auth0 Authorization Server は Token B を発行します。Token B は Token A と同じ
sub(ユーザー ID) を持ちますが、aud(audience) はファーストパーティ API になります。 - ダウンストリーム呼び出し: MCP Server は Token B を使用してファーストパーティ API を呼び出します。API は Token B を検証し、そのリクエストが正当に元のユーザーに「代わって」行われていることを確認します。
ユーザー > API1 > API2 > API3
- ユーザー認証: ユーザーはクライアントアプリケーションで正常に認証されます。Auth0 Authorization Server は、API1 向けのスコープを持つ Token A を発行します。
- 最初のリクエスト: クライアントアプリケーションは API1 を呼び出し、
Authorization: Bearerヘッダーで Token A を渡します。 - API1 から API2 への委譲: API1 は Token A を受け取って検証した後、Auth0 Authorization Server の
/oauth/tokenエンドポイントに渡します。OBO token exchange を使用して、API1 は Token A をsubject_tokenとして提示し、API2 向けの新しいトークンを要求します。 - トークンの発行: Auth0 Authorization Server は API1 に新しいアクセストークンである Token B を付与します。Token B は Token A と同じ
sub(ユーザー ID) を持ちますが、aud(オーディエンス) は API2 になります。 - ダウンストリーム呼び出し: API1 は Token B を使用して API2 にリクエストを送信します。
- API2 から API3 への委譲: API2 は Token B を受け取って検証した後、Auth0 Authorization Server の
/oauth/tokenエンドポイントに渡します。OBO token exchange を使用して、API2 は Token B をsubject_tokenとして提示し、API3 向けの新しいトークンを要求します。 - トークンの発行: Auth0 Authorization Server は API2 に新しいアクセストークンである Token C を付与します。Token C は Token A および Token B と同じ
sub(ユーザー ID) を持ちますが、aud(オーディエンス) は API3 になります。 - ダウンストリーム呼び出し: API2 は Token C を使用して API3 にリクエストを送信します。API3 は Token C を検証し、そのリクエストが元のユーザーに代わって正当に行われていることを確認します。
前提条件
app_typeをresource_serverに設定します。resource_server_identifierを有効なリソースサーバー (例:https://my-api.example.com) に設定します。Auth0 は、認可リクエストでリソースサーバー identifier を audience パラメーターとして使用します。
Custom API クライアントを作成
- Auth0 Dashboard
- Management API
Auth0 Dashboard で Custom API クライアントを作成するには、次の手順に従います。

- Applications > APIs に移動し、バックエンド API を選択します。

- Add Application を選択し、アプリケーション名を入力します。
- Add を選択します。

クライアントグラントを作成
- Auth0 Dashboard
- Management API
- Applications > Applications に移動し、Custom API client を選択します。
- API Access でリソースサーバー (例:
https://my-api.example.com) を見つけ、Edit を選択します。 - User-Delegated Access で Grant Access を選択し、付与する権限、または Always grant all permissions を選択します。
- Save を選択します。
OBO token exchange を設定する
- Auth0 Dashboard
- Management API
- アプリケーション > アプリケーション に移動し、Custom API client を選択します。
- Token Exchange で、On-Behalf-Of Token Exchange をオンにします。
- Save を選択します。

OBO token exchange を実行する
auth0-api-js、auth0_api_python、または Authentication API を使用します。
API 呼び出しのたびに新しいトークンをリクエストするのではなく、アクセストークンは有効期限が切れるまでキャッシュしてください。アクセストークンは期限切れになるまで再利用できます。トークン交換を繰り返すと、リソースの無駄遣いになり、レイテンシが増加し、レート制限に達するおそれがあります。
- JavaScript
- Python
- cURL
始める前に、次に、
auth0-api-js ライブラリと、その依存関係がインストールされていることを確認してください。まず、MCP サーバーの資格情報を使って ApiClient を初期化します。getTokenOnBehalfOf() メソッドを使用してトークン交換を行います。getTokenOnBehalfOf() は、次のプロパティを含むオブジェクトを返します。accessToken: downstream API 用の新しいトークンscope: 付与されたスコープexpiresIn: トークンの有効期限 (秒)
トークンバインディング
- DPoP: 受信した DPoP proof の
jwkの JWK SHA-256 thumbprint を計算し (RFC 7638 に従う) 、サブジェクトトークンのcnf.jktクレーム と一致することを検証します。Auth0 はトークン交換中にこのチェックを実行しません。 - mTLS: クライアント証明書の DER エンコーディングの SHA-256 thumbprint を base64url エンコードし、サブジェクトトークンの
cnf.x5t#S256クレーム と一致することを検証します。
/oauth/token endpoint に提示すると、Auth0 は新たに発行する アクセストークン を送信者に制約します。
DPoP proof も mTLS 証明書も提示されない場合、Auth0 は元のサブジェクトトークンのバインディング status にかかわらず、バインドされていない bearer token を発行します。
バインディングメカニズムの移行と capabilities の不一致: 中間層サービスは、新しいメカニズムに必要な資格情報 (たとえば、プロビジョニング済みの mTLS 証明書) を保有していれば、OBO 交換中にバインディングメカニズムを切り替えられます (たとえば、DPoP から mTLS へ) 。新たに発行されるトークンには、新しいバインディングタイプが反映されます。
交換前に、ダウンストリーム API が提示するバインディングメカニズムをサポートしていることを確認してください。Auth0 はメカニズムの互換性を検証せず、互換性にかかわらずトークンを発行します。ダウンストリーム API が提示されたメカニズムをサポートしていない場合、runtime でトークンを拒否します。メカニズム間の調整ができない場合は、交換を試行せず、代わりに呼び出し元へ error を返してください。
DPoP nonce: 元のサブジェクトトークンが、サーバー発行 nonce を使用する DPoP により public client (SPA やモバイルアプリなど) に発行された場合、中間層サービスは
/oauth/token endpoint で再バインディングするための有効な nonce を持っていない可能性があります。この場合、Auth0 は DPoP-Nonce response header に新しい nonce を含む use_dpop_nonce error を返します。新しい DPoP proof でその nonce を使用して request を再試行してください。
元のサブジェクトトークンが送信者に制約されているにもかかわらず、中間層サービスがバインディング資格情報 (DPoP proof または mTLS 証明書) を
/oauth/token エンドポイントに提示しない場合、Auth0 はリクエストを拒否しません。代わりに、エラーを示さずにバインドされていない bearer token を発行します。ダウンストリーム API は Proof of Possession なしでこのトークンを受け入れるため、傍受されると再利用される可能性があります。ダウンストリームのリソースサーバーが送信者に制約された tokens を必要とする場合は、バインドされていない token を forward しないでください。拒否して、呼び出し元にエラーを返してください。Organizations のサポート
org_id クレームが含まれます。OBOトークン交換では、この organization のコンテキストが委譲チェーン全体で保持されます。
Auth0 が organization に関連付けられたアクセストークンを含む OBOトークン交換リクエストを受け取ると、次の点を検証します。
org_idがテナント内に存在すること- ユーザー (
subで識別される) がその organization のメンバーであること
- 元のトークンと同じ
org_idクレームを含む - 同じ organization 固有の RBAC ポリシーを適用する
post-loginActions トリガーで、event.organizationプロパティを通じて organization のコンテキストを利用できるようにする