OBOトークン交換フロー

OBOトークン交換フロー A sequence diagram generated by Archify. GET / (未ログイン) 認可コードフロー(リダイレクト→ログイン→コード交換) scope: openid, profile, api://<ミドル層App>/access_as_user Token A(aud=ミドル層App) セッションCookie発行。upstream_headersでName/EmailをX-User-*へ、Token AをAuthorization: Bearerへマッピング X-User-*, Bearer Token A Chat UI表示(ログイン中) プロンプト送信(例:「東京都の顧客を検索して」) tools/call(Bearer Token A) openid-connectがToken Aを検証。client_id(ミドル層App)がaudienceと一致するためOBO交換を実行できる token_exchange(jwt_bearer, provider=microsoft) scope=api://ダウンストリームAPI App/.default Token B(aud=ダウンストリームAPI App、groups付き) kong.ctx.shared.ai_mcp_oauth2に書き込み、ai-mcp-proxyのACL評価(groupsをtools[].acl.allowと照合)に渡す GET /customers(許可時、Bearer Token B) 実データ(顧客ID/氏名/性別/都道府県) tools/callレスポンス ACL拒否時は403 Forbidden(tools/listにも出現しない) 回答を表示 ログイン(認可コードフロー) Tool呼び出し OBOトークン交換 ACL評価 + データ取得 ユーザー · ブラウザ · Sequence participant ユーザー ブラウザ Kong Route① · openid-connect · Sequence participant Kong Route① openid-connect Entra ID · IdP · Sequence participant Entra ID IdP chat-ui · Next.js · Sequence participant chat-ui Next.js Kong Route② · OBO + ACL · Sequence participant Kong Route② OBO + ACL demo-api · Customer API · Sequence participant demo-api Customer API Legend request return security default message

Token A → Token B

  • • oid/appidは同一のまま、audienceとscopeがミドル層AppからダウンストリームAPI Appへ切り替わる
  • • groupsクレームはToken Bで初めて現れ、ACL評価に使われる

ACL評価

  • • ai-mcp-proxyがacl_attribute_type: oauth_access_token / access_token_claim_field: groupsでToken Bのgroupsを読む
  • • 許可時はGET /customersを中継、拒否時は403 Forbidden(tools/listにも出現しない)

OBOの本質

  • • ユーザーの同意を都度求めることなくトークンを交換する(RFC 7523, JWT Bearer)
  • • Entra ID向けにprovider: microsoftを指定するとrequested_token_use=on_behalf_ofが自動付与される