Rich Authorization Requests (RAR)

平坦な `scope` 文字列の代わりに、client は `authorization_details` という型付き JSON オブジェクトの配列を送り、ある口座への特定金額の支払い 1 件のように、欲しいものを正確に伝える。

現在地
RFC として公開済み
公式本文
RFC 9396
公式に文書化された対応
3
動き
2 件の動き (90 日)

RFC を英日対訳で読む解説の元ファイル (GitHub)

どういうときに使うか

  • 支払い開始 API: ユーザーは金額、通貨、受取人を含む特定の送金に同意しなければならず、payments のような scope ではそれを運べない。authorization_details は取引そのものを運ぶので、同意画面も access token もその取引に結び付く (Section 1)。
  • カテゴリではなくリソース単位でアクセスを決める API: locations、actions、datatypes で、どのリソースサーバー、どの操作、どの種類のデータかを伝えられる。組み合わせごとに scope 文字列を発明しなくてよい (Section 2.2)。
  • scope の一覧ではなく許可された詳細が必要なリソースサーバー: 認可サーバーは許可した authorization_details を JWT claim かイントロスペクションでリソースサーバーに渡さなければならない (Section 9、9.1、9.2)。
  • scope だけでは client が何を求めているか分からない配備: トークンレスポンスはリソースオーナーが許可した authorization_details を返すので、client は実際に何を得たかを知れる (Section 7)。
図
flowchart LR
    A["client が特定の操作 1 件に同意を求める"] -->|"scope=payments: 粗く、金額も受取人も表せない"| B["過大な許可、同意画面に取引を出せない、RS は詳細を検査できない"]
    A -->|"authorization_details: 型付き JSON オブジェクト"| C["正確な要求、正確な同意、RS が強制できる正確な token 内容"]

解決する問題

scope は文字列の一覧でしかない。client がどの種類のアクセスを求めているかは言えても、どのリソース、いくら、誰宛てかは言えない。支払いでは、認可サーバーは意味のある同意を得るために実際の取引をユーザーに見せなければならず、リソースサーバーは後でまさにその取引を強制しなければならない。どちらも、client とサーバーが事前に合意した文字列には収まらない。

RAR は authorization_details パラメータを導入し、client が JSON データ構造の表現力を使って細粒度の認可要件を指定できるようにする (Section 1)。各 type の解釈は認可サーバーが握り (Section 2.1)、許可された内容は token へ、そしてリソースサーバーへ流れる。

仕組み

図
sequenceDiagram
    participant C as クライアント
    participant AS as 認可サーバー
    participant RS as リソースサーバー
    C->>AS: 認可リクエストに authorization_details オブジェクトの配列、各要素は type と locations, actions, datatypes, identifier, privileges などのフィールド
    AS->>AS: 未知の type は invalid_authorization_details で拒否
    AS-->>C: 詳細から同意画面を表示し、その後 code
    C->>AS: トークンリクエスト、token に載せる内容を絞るため任意で authorization_details
    AS-->>C: access_token と許可された authorization_details
    C->>RS: access token を付けて要求
    RS->>AS: イントロスペクション、または authorization_details JWT claim を読む
    RS-->>C: 許可された詳細を強制

authorization_details は JSON 表記でオブジェクトの配列を含み、各オブジェクトには認可詳細の型を文字列で識別する必須の type がある (Section 2)。仕様は API をまたいで使える共通フィールドとして locations、actions、datatypes、identifier、privileges を定義する (Section 2.2)。client はこのパラメータを scope と同じ場所、つまり認可リクエストで送る (Section 3)。認可サーバーは未知の type を拒否し、invalid_authorization_details で応答しなければならない (Section 5)。トークンエンドポイントで client は、この access token にどの詳細を割り当てたいかを伝えるために authorization_details を再び送ってよく (Section 6)、トークンレスポンスはリソースオーナーが許可した authorization_details を返さなければならない (Section 7)。リソースサーバー向けには、JWT access token は audience で絞った詳細をトップレベルの authorization_details claim として持つべきで (Section 9.1)、イントロスペクション応答は同じ構造を含まなければならない (Section 9.2)。

仕様が求めること

  • リクエストパラメータ authorization_details はオブジェクトの JSON 配列で、各要素に type が必須 (Section 2)。
  • type の値の解釈は認可サーバーが制御する (Section 2.1)。
  • ある API は scope と authorization_details のどちらか一方だけを使うことが推奨される (Section 3.1)。
  • 認可サーバーは未知の認可詳細型の処理を拒否し、列挙された場合に invalid_authorization_details を返さなければならない (Section 5)。
  • トークンレスポンスはリソースオーナーが許可した authorization_details も返さなければならず、添えられる詳細は client の要求と異なってよい (Section 7、7.1)。
  • 認可サーバーは許可したデータをリソースサーバーに渡さなければならない。トップレベルの JWT claim か、同じ構造のイントロスペクション応答で (Section 9、9.1、9.2)。
  • サーバーメタデータは authorization_details_types_supported を公開し、client メタデータは authorization_details_types を使う (Section 10)。

注意点

  • authorization_details はユーザーエージェントを経由するので、完全性が問題になるなら client は署名付き request object か pushed な request_uri で改ざんと差し替えから守らなければならない (Section 12)。
  • トークンリクエストの詳細が許可済みの部分集合かを判断するとき、認可サーバーは単純なオブジェクト比較に頼るべきでない。フィールドの積集合には副作用がありうる (Section 6.1)。
  • 型は 1 つごとに配備作業になる。型を定義し、サーバーメタデータで公開し、同意画面でどう見せるかを決め、リソースサーバーがどう処理するかを決める (Section 11.1)。
  • 大きな authorization_details は認可 URL を大きくするので、pushed authorization request と request_uri を使う (Section 11.4)。
  • 認可詳細はプライバシーを保つ形で設計し使うことがとりわけ重要 (Section 13)。

出典

他の仕様との関係

関係図
flowchart LR
  s_rar["Rich Authorization Requests"]
  s_oauth2["OAuth 2.0"]
  s_rar_metadata_remediation["RAR Metadata and Error Remediation"]
  style s_rar stroke-width:3px
  s_rar -->|拡張対象| s_oauth2
  s_rar_metadata_remediation -->|拡張対象| s_rar

公式に文書化された対応

利用状況には、公式のドキュメント(ベンダーやプロジェクト自身のもの、または標準化団体がその名前を挙げているページ)に対応が明記されているものだけを載せている。引用した文言がそのページにまだあるかは毎週確認している。実験的・アルファ・ベータの対応は「プレビュー」として別に数える。

製品・IdP・サービス

  • Auth0 (IdP): PAR を使う認可コードフローと CIBA で authorization_details を扱う 出典 (確認 2026-11-11)
  • PingFederate (IdP): OAuth の Rich Authorization Requests に対応 出典 (確認 2026-11-11)

OSS 実装

  • node-oidc-provider (ライブラリ): 実装済み仕様の一覧に RFC 9396 を掲載 出典 (確認 2026-11-11)

動き

Datatracker の revision 履歴、このサイトの日次 run が書いた解説、draft 名を挙げた ML の件名。

このサイトの解説

  • 新しい提案OAuth WG

    Agent Passport の著者が、累積上限・RAR による付与・制約種別ごとの委任レシート縮小規則について -01 の方針を示した。

    New draft: Agent Passports and Delegation Receipts (draft-le-agent-passport-00) (2 new messages)

    解説を読む

    Ben Le は Kieran Sweeney への返信で、-01 では累積上限を持つレシートは依拠当事者を一つだけ指名しなければならず、その当事者がレシートとすべての子レシートの合計を単独で数えると述べた。単一の指名がない上限付きレシートは無効となる。複数の依拠当事者間で合計を共有することは対象外であり、呼び出し経路上の他の当事者が合計を保持する可能性は未決である。付与には RFC 9396 の authorization_details タイプを定義し、RAR 対応の認可サーバーがルートレシートを直接発行できるようにする。エージェントがパスポートをアクタートークンとしてレシートを得る場合は Token Exchange を使い続ける。さらに制約種別ごとの包含規則表(host、port、methods、paths、tools、max_body_bytes、max_calls、max_spend、exp、aud)を示した。子が親を縮小したといえるのはすべての規則を満たす場合のみであり、未知のメンバーや比較できないものは拒否される。-01 にはチェーン当たり 8 レシートという固定上限のみがあり、深さのクレームはない。IETF 127 に先立ち、11月16日の Niki 主催のサイドミーティングに参加し、17日に自身のサイドミーティングを開く予定である。

    • RAR に対応済みの認可サーバーは、新しい authorization_details タイプを使ってエージェント向けのルート委任レシートを発行できる。
    • エージェントのチェーンに累積の支出上限や呼び出し回数上限を適用する依拠当事者は、レシート内で指名された唯一のカウンターとなる必要がある。
    • 複数のエージェント委任ドラフトを実装する者は、制約種別ごとの縮小規則表を共通のテストベクトルの出発点にできる。
    • 関連: IETF WIMSE: draft-asor-wimse-agent-delegation-chain. スレッドで、比較対象となる独自の包含規則を持つドラフトとして挙げられている。
    • 関連: IETF WIMSE: draft-hulea-wimse-agent-mandate. スレッドで、縮小規則の比較対象として Hulea の名で挙げられている。
    • 関連: IETF WIMSE: draft-sweeney-wimse-credential-delegation. スレッドで返信している Kieran Sweeney が著者の委任ドラフトである。著者名のみに基づく推定である。
  • 新しい提案OAuth WG

    新規の個人ドラフトが Agent Passport と Delegation Receipt を定義し、Token Exchange で発行する

    New draft: Agent Passports and Delegation Receipts (draft-le-agent-passport-00)

    解説を読む

    draft-le-agent-passport-00 は二種類の署名付きオブジェクトを定義する。Agent Passport は、エージェントの鍵(cnf)を責任を負う組織とビルドのダイジェストに結び付ける JWT である。Delegation Receipt はユーザーからエージェント、サブエージェントへ続く連鎖で、各段は鍵に束縛され、前の段より権限を狭めることしかできない。依拠当事者は連鎖を検証し、ユーザー自身のアクセス権との共通部分を取る。ルートの receipt は RFC 8693 の Token Exchange で取得し、passport を actor token とし、新しい requested_token_type urn:ietf:params:oauth:token-type:agent-delegation を用いる。ステータスは Token Status List ドラフトで表す。未解決の論点は、付与を RFC 9396 の authorization_details の type として表すべきかどうかである。著者は IETF 127 でのサイドミーティングと IPR 開示にも触れ、draft-klrc-aiagent-auth や AAuth を補完するものだと述べている。

    sequenceDiagram
      participant U as User
      participant A as Agent
      participant AS as Authorization Server
      participant RP as Relying Party
      A->>AS: Token Exchange, actor_token = Agent Passport
      AS-->>A: root Delegation Receipt (agent-delegation type)
      A->>A: sub-agent receipt, narrower than parent
      A->>RP: passport and receipt chain
      RP->>RP: verify chain, intersect with user access
    • RAR に対応済みの認可サーバーが、エージェントへの委任を authorization_details として発行したい場合
    • 組織をまたいで、サブエージェントの権限がユーザーの権限の部分集合であることを依拠当事者が検証する必要がある場合
    • 関連: OpenID: openid/aauth. 著者は、このドラフトは AAuth を補完するものだと述べている。