RFC 9126 OAuth PAR 2021年9月
Lodderstedt, et al. 標準化過程 [ページ]
ストリーム:
インターネット技術タスクフォース (IETF)
RFC:
9126
カテゴリー:
標準化過程
公開:
ISSN:
2070-1721
著者:
T. Lodderstedt
yes.com
B. Campbell
Ping Identity
N. Sakimura
NAT.Consulting
D. Tonge
Moneyhub Financial Technology
F. Skokan
Auth0

RFC 9126

OAuth 2.0 プッシュ型認可リクエスト

概要

本文書はプッシュ型認可リクエスト (PAR) エンドポイントを定義します。これにより、 クライアントは OAuth 2.0 認可リクエストのペイロードを直接リクエストによって 認可サーバーにプッシュでき、その後の認可エンドポイントへの呼び出しで データへの参照として使用されるリクエスト URI が 提供されます。

本文書の位置付け

これはインターネット標準化過程の文書です。

本文書はインターネット技術タスクフォース (IETF) の成果物です。これは IETF コミュニティの総意を表しています。本文書は 公開レビューを受け、インターネット技術運営グループ (IESG) によって 公開が承認されています。インターネット標準に関する詳細な 情報は RFC 7841 の第2節で 入手できます。

本文書の現在の状態、あらゆる 正誤情報、および本文書へのフィードバックの提供方法に関する情報は https://www.rfc-editor.org/info/rfc9126 で入手できます。

▲

目次

1. はじめに

本文書は、OAuth [RFC6749] クライアントが 認可リクエストのペイロードを直接 認可サーバーにプッシュできるようにする、プッシュ型認可リクエスト (PAR) エンドポイントを定義します。 その代わりにリクエスト URI 値を受け取ります。これは、その後ユーザーエージェントを介して 認可エンドポイントを呼び出す際に、認可リクエストのペイロードデータへの参照として使用されます。

OAuth [RFC6749] では、認可 リクエストパラメーターは通常、ユーザーエージェントでのリダイレクトを介して URI クエリ パラメーターとして送信されます。これは単純ですが、いくつかの課題も生じます:

JWT-Secured Authorization Request (JAR) [RFC9101] は、OAuth クライアントが認可リクエスト パラメーターを、署名され、任意で暗号化された JSON Web Token (JWT) [RFC7519] であるリクエストオブジェクトにまとめることを可能にし、セキュリティ上の課題に対する解決策を提供します。 サイズ制限に対処するため、JAR は request_uri パラメーターを導入します。これにより、 クライアントはリクエストオブジェクト自体の代わりに、リクエストオブジェクトへの参照を送信できます。

本文書は、認可リクエストのペイロードを 認可サーバーに直接プッシュし、その後の認可リクエストで認可サーバーにおいて使用できる request_uri 値と交換するための相互運用可能な方法を提供することで、JAR を補完します。

PAR は、機密性と 完全性が保護された認可リクエストを行うための簡単な手段をクライアントに提供することで、OAuth のセキュリティを促進します。 さらに高いセキュリティレベル、特に暗号学的に確認された否認防止を必要とするクライアントは、 [RFC9101] で定義される JWT ベースのリクエストオブジェクトを PAR と組み合わせて使用できます。

PAR により、認可サーバーはユーザーとの 対話が発生する前にクライアントを認証できます。 認可処理中にクライアントの ID に対する確信が高まることで、 認可サーバーは不正なリクエストを処理のより早い段階で拒否でき、 クライアントのなりすましや、認可リクエストの改ざんまたは悪用の試みを防止できます。

第3.1節 of [RFC6749] および [OIDC] の第3.1.2.1節で説明されているように、 ユーザーエージェントを介した認可エンドポイントへの HTTP POST リクエストも、 上記のリクエストサイズ制限に対処するために使用できます。しかし、[RFC6749] では任意であるにすぎず、サポートされている場合でも、 従来の Web アプリケーションでは実用的な選択肢ですが、インストール型モバイルアプリケーションで使用することは 極めて困難です。[RFC8252] で説明されているように、 これらのアプリはプラットフォーム固有の API を使用して、システムブラウザーで認可リクエスト URI を開きます。 しかし、モバイルアプリがブラウザーを起動する場合、その結果となる最初のリクエストは GET メソッドの使用に制約されます。認可リクエストに POST を使用するには、アプリがまず、 大きな認可リクエストペイロードを何らかの方法で伝達しながら、アプリが制御する URI を GET で 開くようブラウザーに指示し、その結果のレスポンスに、 認可サーバーに向けたクロスサイトのフォーム POST を開始するためのコンテンツとスクリプトを 含める必要があります。PAR はより簡単に使用でき、上記のような追加のセキュリティ上の利点があります。

1.1. 導入例

従来の OAuth 2.0 では、クライアントは通常、 ユーザーエージェントに、認可サーバーの認可エンドポイントに対して次のような HTTP リクエストを 行わせることで認可リクエストを開始します(追加の改行とインデントは 表示上の目的のみです):

 GET /authorize?response_type=code
  &client_id=CLIENT1234&state=duk681S8n00GsJpe7n9boxdzen
  &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1
 Host: as.example.com

代わりに、このようなリクエストは、 次の例に示すように、クライアントが PAR エンドポイントに POST リクエストを送ることで 認可サーバーに直接プッシュできます(追加の改行と空白は表示上の目的のみです)。 リクエストは認可サーバーに直接行われるため、クライアントは認証できます (たとえば、ここに示す JWT クライアントアサーションベースの認証を使用します)。

 POST /as/par HTTP/1.1
 Host: as.example.com
 Content-Type: application/x-www-form-urlencoded

 &response_type=code
 &client_id=CLIENT1234&state=duk681S8n00GsJpe7n9boxdzen
 &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
 &client_assertion_type=
  urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
 &client_assertion=eyJraWQiOiI0MiIsImFsZyI6IkVTMjU2In0.eyJpc3MiOiJDTE
  lFTlQxMjM0Iiwic3ViIjoiQ0xJRU5UMTIzNCIsImF1ZCI6Imh0dHBzOi8vc2VydmVyL
  mV4YW1wbGUuY29tIiwiZXhwIjoxNjI1ODY4ODc4fQ.Igw8QrpAWRNPDGoWGRmJumLBM
  wbLjeIYwqWUu-ywgvvufl_0sQJftNs3bzjIrP0BV9rRG-3eI1Ksh0kQ1CwvzA

認可サーバーはリクエスト URI で応答します:

 HTTP/1.1 201 Created
 Cache-Control: no-cache, no-store
 Content-Type: application/json

 {
   "request_uri": "urn:example:bwc4JK-ESC0w8acc191e-Y1LTC2",
   "expires_in": 90
 }

クライアントはリクエスト URI 値を使用して、 ユーザーエージェントに認可サーバーの 認可エンドポイントへ次のような HTTP リクエストを行わせることで、その後の認可 リクエストを作成します(追加の改行とインデントは表示上の目的のみです):

 GET /authorize?client_id=CLIENT1234
  &request_uri=urn%3Aexample%3Abwc4JK-ESC0w8acc191e-Y1LTC2 HTTP/1.1
 Host: as.example.com

1.2. 規約および 用語

本文書におけるキーワード "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、 "MAY"、および "OPTIONAL" は、 ここに示すようにすべて大文字で記述されている場合に限り、 BCP 14 [RFC2119] [RFC8174] に 記載されているとおりに解釈されます。

本仕様では、「The OAuth 2.0 Authorization Framework」[RFC6749] で定義されている「アクセストークン」、 「認可サーバー」、「認可エンドポイント」、 「認可リクエスト」、「トークンエンドポイント」、 および 「クライアント」という用語を使用します。

2. プッシュ型認可リクエストエンドポイント

プッシュ型認可リクエストエンドポイントは、認可サーバーにある HTTP API であり、 application/x-www-form-urlencoded 形式を使用して HTTP リクエストメッセージ本文にパラメーターを含む HTTP POST リクエストを受け付けます。この形式の文字エンコーディングは UTF-8 であり、 付録 B of [RFC6749] で説明されています。PAR エンドポイント URL は "https" スキームを使用しなければ MUST なりません。

PAR をサポートする認可サーバーは、第5節で定義される pushed_authorization_request_endpoint パラメーターを使用して、 認可サーバーメタデータ文書 [RFC8414] にプッシュ型認可リクエストエンドポイントの URL を 含めるべきです SHOULD。

このエンドポイントは、認可エンドポイント用に [RFC6749] で定義された認可リクエストパラメーター、および 認可エンドポイント用に定義されたすべての適用可能な拡張を受け付けます。そのような拡張の例には、 Proof Key for Code Exchange (PKCE) [RFC7636]、Resource Indicators [RFC8707]、および OpenID Connect (OIDC) [OIDC] があります。このエンドポイントは、 [RFC9101] および本文書の 第3節 に従って、認可リクエストパラメーターの集合をリクエストオブジェクトとして 送信することも MAY サポートできます。

トークンエンドポイントリクエストについて [RFC6749] で定義されているクライアント認証の規則は、適用可能な 認証方式を含め、PAR エンドポイントにも適用されます。該当する場合、 token_endpoint_auth_method クライアントメタデータパラメーター [RFC7591] は、PAR エンドポイントへのリクエストを含め、 認可サーバーへ直接リクエストを行う際にクライアントが使用する登録済み認証方式を示します。 同様に、token_endpoint_auth_methods_supported 認可サーバーメタデータ [RFC8414] パラメーターは、PAR エンドポイントへの リクエストを含め、クライアントからの直接リクエストを受け付ける際に認可サーバーがサポートするクライアント認証方式を 列挙します。

歴史的な理由により、JWT クライアントアサーションベースの認証 (第2.2節 of [RFC7523] で定義され、[OIDC] の第9節にある private_key_jwt または client_secret_jwt 認証方式名を使用するもの)を採用する場合に使用する適切な audience 値について、曖昧さが生じる可能性があります。この曖昧さに対処するため、 [RFC8414] に従った 認可サーバーの issuer 識別子 URL を audience の値として使用するべきです SHOULD。相互運用性を促進するため、 認可サーバーは、自身を意図された audience として識別する値として、自身の issuer 識別子、 トークンエンドポイント URL、またはプッシュ型認可リクエストエンドポイント URL を受け付けなければ MUST なりません。

2.1. リクエスト

クライアントは、認可リクエストを構成するパラメーターを直接 PAR エンドポイントに送信します。一般的なパラメーターセットには、次の例に示すように client_id、response_type、redirect_uri、 scope、state、 code_challenge、および code_challenge_method が含まれることがあります。 ただし、プッシュ型認可リクエストは、[RFC6749] で定義されたもの、および適用可能なすべての拡張を含め、 認可エンドポイントで使用可能な任意のパラメーターから構成できます。 request_uri 認可リクエストパラメーターは例外であり、 提供しては MUST NOT なりません。

リクエストには、対象のクライアントに応じて、 クライアント認証に必要な追加パラメーター(たとえば、client_secret または client_assertion と client_assertion_type)も含まれます。このようなパラメーターは、 トークンエンドポイントで使用するために定義および登録されていますが、クライアント 認証にのみ適用されます。プッシュ型認可リクエストに存在する場合、それらは クライアント認証にのみ使用され、認可リクエスト自体には関係しません。クライアント 認証に関係しないトークンエンドポイントパラメーターは、プッシュ型認可リクエストにおいて定義された意味を 持ちません。client_id パラメーターは、認可リクエストと トークンエンドポイントへのリクエストの両方で同じ意味論を持つよう定義されています。必須の 認可リクエストパラメーターであるため、プッシュ型認可リクエストでも同様に必須です。

クライアントは、 付録 B of [RFC6749] で説明されているように、 UTF-8 の文字エンコーディングを使用し、x-www-form-urlencoded で整形したパラメーターを含む HTTP POST リクエストのメッセージ本文を構築します。 該当する場合、クライアントはトークンエンドポイントリクエストの場合と同じ規則を使用して、 認証資格情報もリクエストヘッダーまたは リクエスト本文に追加します。

次の例でこれを示します(メッセージ 本文内の追加の改行は表示上の目的のみです):

 POST /as/par HTTP/1.1
 Host: as.example.com
 Content-Type: application/x-www-form-urlencoded

 response_type=code&state=af0ifjsldkj&client_id=s6BhdRkqt3
 &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
 &code_challenge=K2-ltc83acc4h0c9w6ESC_rEMTJ3bww-uCHaoeK1t8U
 &code_challenge_method=S256&scope=account-information
 &client_assertion_type=
  urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
 &client_assertion=eyJraWQiOiJrMmJkYyIsImFsZyI6IlJTMjU2In0.eyJpc3Mi
  OiJzNkJoZFJrcXQzIiwic3ViIjoiczZCaGRSa3F0MyIsImF1ZCI6Imh0dHBzOi8vc
  2VydmVyLmV4YW1wbGUuY29tIiwiZXhwIjoxNjI1ODY5Njc3fQ.te4IdnP_DK4hWrh
  TWA6fyhy3fxlAQZAhfA4lmzRdpoP5uZb-E90R5YxzN1YDA8mnVdpgj_Bx1lG5r6se
  f5TlckApA3hahhC804dcqlE4naEmLISmN1pds2WxTMOUzZY8aKKSDzNTDqhyTgE-K
  dTb3RafRj7tdZb09zWs7c_moOvfVcQIoy5zz1BvLQKW1Y8JsYvdpu2AvpxRPbcP8W
  yeW9B6PL6_fy3pXYKG3e-qUcvPa9kan-mo9EoSgt-YTDQjK1nZMdXIqTluK9caVJE
  RWW0fD1Y11_tlOcJn-ya7v7d8YmFyJpkhZfm8x1FoeH0djEicXTixEkdRuzsgUCm6
  GQ

認可サーバーは、リクエストを 次のように処理しなければ MUST なりません:

  1. トークンエンドポイントと同じ方法でクライアントを認証する (第 2.3節 of [RFC6749])。
  2. request_uri 認可 リクエストパラメーターが提供されている場合、リクエストを拒否する。
  3. プッシュされたリクエストを、認可エンドポイントに送信された 認可リクエストと同じように検証する。たとえば、認可サーバーは、 リダイレクト URI がクライアント用に設定されたリダイレクト URI のいずれかに一致するかどうかを確認し、 また、クライアントがアクセスを要求しているスコープについて認可されているかどうかも確認します。この 検証により、認可サーバーは不正または詐欺的なリクエストを 早期に拒否できます。認可サーバーは、プッシュされたリクエストを処理する際に 実行できない検証手順を MAY 省略できます。ただし、そのような確認は、 認可エンドポイントで認可リクエストを処理する際に MUST 実行しなければなりません。

認可サーバーは、認証資格情報を持つクライアントに対し、 プッシュ型認可リクエストごとに認可リクエスト単位のリダイレクト URI を設定することを MAY 許可できます。第2.4節でより詳しく説明されているように、これは、[RFC6749] とは異なり、本仕様が 実際の認可リクエストが行われる前に、認可サーバーがクライアントを認証し、 クライアントのリクエストを検証できるようにするため可能です。

2.2. 成功レスポンス

検証に成功した場合、サーバーはリクエスト URI を 生成し、201 HTTP ステータスコードとともにレスポンスで提供しなければ MUST なりません。 次のパラメーターは、[RFC8259] で定義された application/json メディアタイプを使用する HTTP レスポンスのメッセージ本文にトップレベルのメンバーとして含まれます。

request_uri
送信された 認可リクエストに対応するリクエスト URI。この URI は、その後の認可リクエストにおいて 対応するリクエストデータへの一度限りの参照です。認可処理が 認可リクエストデータを取得する方法は認可サーバーの裁量に委ねられ、 本仕様の範囲外です。この URI を介して認可リクエストデータを 他の当事者が利用できるようにする必要はありません。
expires_in
リクエスト URI の有効期間を 秒単位の正の整数として表す JSON 数値。リクエスト URI の有効期間は 認可サーバーの裁量に委ねられますが、通常は比較的短いものです(たとえば、 5 秒から 600 秒の間)。

request_uri 値の形式は 認可サーバーの裁量に委ねられますが、有効な値を予測または推測することが 計算上実行不可能となるよう、暗号学的に強力な疑似乱数アルゴリズムを使用して生成された 一部を含まなければ MUST なりません(詳細については 第 10.10節 of [RFC6749] を参照してください)。 認可サーバーは、対応する認可リクエストデータを参照する URI のランダム部分として <reference-value> を使用し、 urn:ietf:params:oauth:request_uri:<reference-value> の形式で request_uri 値を構築することが MAY できます。

request_uri 値は、 認可リクエストを送信したクライアントに結び付けられなければ MUST なりません。

次は、そのようなレスポンスの例です:

 HTTP/1.1 201 Created
 Content-Type: application/json
 Cache-Control: no-cache, no-store

 {
  "request_uri":
    "urn:ietf:params:oauth:request_uri:6esc_11ACC5bwc014ltc14eY22c",
  "expires_in": 60
 }

2.3. エラーレスポンス

認可サーバーは、第5.2節 of [RFC6749] でトークンエンドポイントからのエラーレスポンスについて 規定されているものと同じ形式で、その節または 第4.1.2.1節 of [RFC6749] にある適切なエラーコードを使用して エラーレスポンスを返します。第 4.1.2.1節 of [RFC6749] が、要求元クライアントへの エラーによる自動リダイレクトを禁止し、そのためエラーコードを定義していない場合 (たとえば、リダイレクト URI の欠落、無効、または不一致によりリクエストが失敗した場合)、 invalid_request エラーコードをデフォルトのエラーコードとして使用できます。 プッシュされた認可リクエストの初期処理にその拡張が関与する場合、 OAuth 拡張で定義されたエラーコードも使用できます。プッシュ型認可リクエストの 初期処理にはリソース所有者との対話が含まれないため、[OIDC] で定義される consent_required など、 ユーザーとの対話に関連するエラーコードは返されません。

認可サーバーまたはクライアントポリシーによって、 クライアントに署名済みリクエストオブジェクトの使用が要求される場合([RFC9101], 第10.5節 を参照)、認可サーバーは 第3節で示された定義に準拠するリクエストのみを MUST 受け付け、その他のリクエストは HTTP ステータスコード 400 および エラーコード invalid_request で MUST 拒否しなければなりません。

上記に加えて、PAR エンドポイントは次の HTTP ステータスコードも使用できます:

405:
リクエストが POST メソッドを使用していない場合、認可サーバーは HTTP 405 (Method Not Allowed) ステータスコードで応答します。
413:
リクエストサイズが認可サーバーの 許容する上限を超えた場合、認可サーバーは HTTP 413 (Payload Too Large) ステータスコードで応答します。
429:
特定の期間内にクライアントから送信された リクエスト数が認可サーバーの許容数を超えた場合、 認可サーバーは HTTP 429 (Too Many Requests) ステータスコードで応答します。

次は PAR エンドポイントからのエラーレスポンスの例です:

 HTTP/1.1 400 Bad Request
 Content-Type: application/json
 Cache-Control: no-cache, no-store

 {
   "error": "invalid_request",
   "error_description":
     "The redirect_uri is not valid for the given client"
 }

2.4. クライアント リダイレクト URI の管理

OAuth 2.0 [RFC6749] は、 特定の状況でクライアントが未登録の redirect_uri 値を使用すること、または 認可サーバーが、認可エンドポイントでクライアントから提示された redirect_uri 値に 独自の一致規則を適用することを許可しています。しかし、OAuth security BCP [OAUTH-SECURITY-TOPICS] および OAuth 2.1 仕様 [OAUTH-V2] は、認可サーバーが redirect_uri パラメーターを、特定のクライアントについて事前に設定された リダイレクト URI の集合と完全一致させることを要求しています。これは、クライアントなりすましの試みを 早期に検出するための手段であり、トークン漏えいおよびオープンリダイレクトを防止します。一方で、 リダイレクト URI は通常、クライアントポリシーの中で最も変動しやすい部分であるため、 クライアント管理がより煩雑になる可能性があります。

認可サーバーとの認証資格情報を確立済みのクライアントが PAR を使用する場合、完全一致要件は MAY 緩和できます。 これは、従来の認可リクエストとは異なり、認可サーバーが認可処理開始前に クライアントを認証し、正当なクライアントと対話していることを確認できるため可能です。 認可サーバーは、そのようなクライアントに対し、認可サーバーに事前登録されていない redirect_uri 値を指定することを MAY 許可できます。これによりクライアントの柔軟性が高まり (たとえば、実行時に認可サーバーごとに異なる redirect_uri 値を生成できるようになり)、 クライアント管理を簡素化できます。提供された redirect_uri 値に 制限を適用するかどうかは認可サーバーの裁量に委ねられます。たとえば、認可サーバーは 特定の URI プレフィックスを要求したり、実行時にクエリ パラメーターだけが変更されることを許可したり MAY できます。

3. "request" リクエストパラメーター

クライアントは、JAR [RFC9101] で定義された request パラメーターを使用して、リクエストオブジェクト JWT を 認可サーバーにプッシュすることが MAY できます。 JAR [RFC9101] で定義された リクエストオブジェクトの処理、署名、および暗号化の規則が適用されます。特定のクライアント認証方式で必要な リクエストパラメーターは、application/x-www-form-urlencoded リクエストに直接含まれ、フォーム本文内では request 以外に許可される唯一のパラメーターです (たとえば、相互 TLS クライアント認証 [RFC8705] は client_id HTTP リクエストパラメーターを使用し、一方 JWT アサーションベースのクライアント認証 [RFC7523] は client_assertion および client_assertion_type を使用します)。その他すべてのリクエストパラメーター、 すなわち認可リクエスト自体に関するものは、認可リクエストを表す JWT の Claim として MUST 出現しなければなりません。

次は、第2.1節の例と同じ認可リクエストペイロードを持つ、 署名済みリクエストオブジェクトを使用したプッシュ型認可リクエストの例です。 クライアントは JWT クライアントアサーションベースの認証 [RFC7523] で認証されています (追加の改行と空白は表示上の目的のみです):

 POST /as/par HTTP/1.1
 Host: as.example.com
 Content-Type: application/x-www-form-urlencoded

 client_assertion_type=
  urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
 &client_assertion=eyJraWQiOiJrMmJkYyIsImFsZyI6IlJTMjU2In0.eyJpc3Mi
  OiJzNkJoZFJrcXQzIiwic3ViIjoiczZCaGRSa3F0MyIsImF1ZCI6Imh0dHBzOi8vc
  2VydmVyLmV4YW1wbGUuY29tIiwiZXhwIjoxNjI1ODY5Njc3fQ.te4IdnP_DK4hWrh
  TWA6fyhy3fxlAQZAhfA4lmzRdpoP5uZb-E90R5YxzN1YDA8mnVdpgj_Bx1lG5r6se
  f5TlckApA3hahhC804dcqlE4naEmLISmN1pds2WxTMOUzZY8aKKSDzNTDqhyTgE-K
  dTb3RafRj7tdZb09zWs7c_moOvfVcQIoy5zz1BvLQKW1Y8JsYvdpu2AvpxRPbcP8W
  yeW9B6PL6_fy3pXYKG3e-qUcvPa9kan-mo9EoSgt-YTDQjK1nZMdXIqTluK9caVJE
  RWW0fD1Y11_tlOcJn-ya7v7d8YmFyJpkhZfm8x1FoeH0djEicXTixEkdRuzsgUCm6
  GQ
 &request=eyJraWQiOiJrMmJkYyIsImFsZyI6IlJTMjU2In0.eyJpc3MiOiJzNkJoZ
  FJrcXQzIiwiYXVkIjoiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20iLCJleHAiOj
  E2MjU4Njk2NzcsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwiY2xpZW50X2lkIjoiczZ
  CaGRSa3F0MyIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vY2xpZW50LmV4YW1wbGUu
  b3JnL2NiIiwic2NvcGUiOiJhY2NvdW50LWluZm9ybWF0aW9uIiwic3RhdGUiOiJhZ
  jBpZmpzbGRraiIsImNvZGVfY2hhbGxlbmdlIjoiSzItbHRjODNhY2M0aDBjOXc2RV
  NDX3JFTVRKM2J3dy11Q0hhb2VLMXQ4VSIsImNvZGVfY2hhbGxlbmdlX21ldGhvZCI
  6IlMyNTYifQ.l9R3RC9bFBHry_8acObQjEf4fX5yfJkWUPfak3J3iiBm0aaQznPw5
  BZ0B3VQZ9_KYdPt5bTkaflS5fSDklM3_7my9MyOSKFYmf46INk6ju_qUuC2crkOQX
  ZWYJB-0bnYEbdHpUjazFSUvN49cEGstNQeE-dKDWHNgEojgcuNA_pjKfL9VYp1dEA
  6-WjXZ_OlJ7R_mBWpjFAzc0UkQwqX5hfOJoGTqB2tE4a4aB2z8iYlUJp0DeeYp_hP
  N6svtmdvte73p5bLGDFpRIlmrBQIAQuxiS0skORpXlS0cBcgHimXVnXOJG7E-A_lS
  _5y54dVLQPA1jKYx-fxbYSG7dp2fw
 &client_id=s6BhdRkqt3

認可サーバーは、第2.1節で定義された 処理規則に加え、次の手順を実行しなければ MUST なりません:

  1. 該当する場合、JAR [RFC9101], 第 6.1節 で規定されているとおり、リクエストオブジェクトを復号する。
  2. JAR [RFC9101], 第 6.2節 で規定されているとおり、リクエストオブジェクトの署名を検証する。
  3. クライアントが認可サーバーとの認証資格情報を 確立済みの場合、認証された client_id が リクエストオブジェクト内の client_id Claim と一致しなければ、リクエストを拒否する。 さらに、iss Claim に client_id との一致を要求するかどうかは、 認可サーバーの裁量に委ねられます。

JSON Web Key (JWK) 形式 [RFC7517] で表現された次の RSA 鍵ペアを、 上記の例のリクエストオブジェクト署名の検証または再生成に使用できます (値内の追加の改行とインデントは表示上の目的のみです):

 {
   "kty": "RSA",
   "kid":"k2bdc",
   "n": "y9Lqv4fCp6Ei-u2-ZCKq83YvbFEk6JMs_pSj76eMkddWRuWX2aBKGHAtKlE
         5P7_vn__PCKZWePt3vGkB6ePgzAFu08NmKemwE5bQI0e6kIChtt_6KzT5Oa
         aXDFI6qCLJmk51Cc4VYFaxgqevMncYrzaW_50mZ1yGSFIQzLYP8bijAHGVj
         dEFgZaZEN9lsn_GdWLaJpHrB3ROlS50E45wxrlg9xMncVb8qDPuXZarvghL
         L0HzOuYRadBJVoWZowDNTpKpk2RklZ7QaBO7XDv3uR7s_sf2g-bAjSYxYUG
         sqkNA9b3xVW53am_UZZ3tZbFTIh557JICWKHlWj5uzeJXaw",
   "e": "AQAB",
   "d": "LNwG_pCKrwowALpCpRdcOKlSVqylSurZhE6CpkRiE9cpDgGKIkO9CxPlXOL
         zjqxXuQc8MdMqRQZTnAwgd7HH0B6gncrruV3NewI-XQV0ckldTjqNfOTz1V
         Rs-jE-57KAXI3YBIhu-_0YpIDzdk_wBuAk661Svn0GsPQe7m9DoxdzenQu9
         O_soewUhlPzRrTH0EeIqYI715rwI3TYaSzoWBmEPD2fICyj18FF0MPy_SQz
         k3noVUUIzfzLnnJiWy_p63QBCMqjRoSHHdMnI4z9iVpIwJWQ3jO5n_2lC2-
         cSgwjmKsFzDBbQNJc7qMG1N6EssJUwgGJxz1eAUFf0w4YAQ",
   "qi": "J-mG0swR4FTy3atrcQ7dd0hhYn1E9QndN-
         -sDG4EQO0RnFj6wIefCvwIc4
         7hCtVeFnCTPYJNc_JyV-mU-9vlzS5GSNuyR5qdpsMZXUMpEvQcwKt23ffPZ
         YGaqfKyEesmf_Wi8fFcE68H9REQjnniKrXm7w2-IuG_IrVJA9Ox-uU",
   "q": "4hlMYAGa0dvogdK1jnxQ7J_Lqpqi99e-AeoFvoYpMPhthChTzwFZO9lQmUo
         BpMqVQTws_s7vWGmt7ZAB3ywkurf0pV7BD0fweJiUzrWk4KJjxtmP_auuxr
         jvm3s2FUGn6f0wRY9Z8Hj9A7C72DnYCjuZiJQMYCWDsZ8-d-L1a-s",
   "p": "5sd9Er3I2FFT9R-gy84_oakEyCmgw036B_nfYEEOCwpSvi2z7UcIVK3bSEL
         5WCW6BNgB3HDWhq8aYPirwQnqm0K9mX1E-4xM10WWZ-rP3XjYpQeS0Snru5
         LFVWsAzi-FX7BOqBibSAXLdEGXcXa44l08iec_bPD3xduq5V_1YoE",
   "dq": "Nz2PF3XM6bEc4XsluKZO70ErdYdKgdtIJReUR7Rno_tOZpejwlPGBYVW19
         zpAeYtCT82jxroB2XqhLxGeMxEPQpsz2qTKLSe4BgHY2ml2uxSDGdjcsrbb
         NoKUKaN1CuyZszhWl1n0AT_bENl4bJgQj_Fh0UEsQj5YBBUJt5gr_k",
   "dp": "Zc877jirkkLOtyTs2vxyNe9KnMNAmOidlUc2tE_-0gAL4Lpo1hSwKCtKwe
         ZJ-gkqt1hT-dwNx_0Xtg_-NXsadMRMwJnzBMYwYAfjApUkfqABc0yUCJJl3
         KozRCugf1WXkU9GZAH2_x8PUopdNUEa70ISowPRh04HANKX4fkjWAE"
  }

4. 認可リクエスト

クライアントは、認可サーバーから返された request_uri 値を使用して、 [RFC9101] で定義された認可リクエストを構築します。次の例では、 クライアントがユーザーエージェントに次の HTTP リクエストを行わせます (追加の改行とインデントは表示上の目的のみです):

 GET /authorize?client_id=s6BhdRkqt3&request_uri=urn%3Aietf%3Aparams
  %3Aoauth%3Arequest_uri%3A6esc_11ACC5bwc014ltc14eY22c HTTP/1.1
 Host: as.example.com

認可リクエスト内容の一部、たとえば code_challenge パラメーター値は特定の認可リクエストに固有であるため、クライアントは request_uri 値を一度だけ使用しなければ MUST なりません。認可サーバーは request_uri 値を一度限りの使用として扱うべきですが SHOULD、ユーザーがユーザーエージェントを再読み込み/更新したことによる 重複リクエストを MAY 許可できます。有効期限が切れた request_uri は無効として拒否しなければ MUST なりません。

認可サーバーは、プッシュされたリクエストから生じる認可リクエストを、 その他の認可リクエストと同様に検証しなければ MUST なりません。 認可サーバーは、リクエストがプッシュされた際に実行した検証手順を MAY 省略できます。ただし、それがプッシュされたリクエストであること、および リクエストまたは認可サーバーのポリシーが、省略した手順の結果に影響を与える形で 変更されていないことを検証できることが条件です。

認可サーバーポリシーは、全体またはクライアント単位で、 クライアントが認可リクエストデータを渡す唯一の手段として PAR を使用するよう定めることが MAY できます。この場合、認可サーバーは PAR エンドポイントから取得した値を持つ request_uri パラメーターがない認可エンドポイントへのリクエストの処理を、 invalid_request エラーコードを使用して拒否します。

5. 認可サーバーメタデータ

PAR に関するサーバーの能力およびポリシーを示すため、 次の認可サーバーメタデータパラメーター [RFC8414] が導入されます。

pushed_authorization_request_endpoint
クライアントが認可リクエストを送信し、 認可サーバーで使用可能な request_uri 値と交換できる プッシュ型認可リクエストエンドポイントの URL。
require_pushed_authorization_requests
認可サーバーが PAR を介してのみ認可リクエストデータを受け付けるかどうかを示すブール値パラメーター。 省略した場合、デフォルト値は false です。

pushed_authorization_request_endpoint が存在するだけで、 クライアントが PAR フローを使用できると判断するには十分であることに注意してください。PAR エンドポイントから 取得した request_uri 値は、request_uri_parameter_supported や require_request_uri_registration [OIDC.Disco] などの他の認可サーバーメタデータに関係なく、 認可エンドポイントで使用できます。

6. クライアントメタデータ

Dynamic Client Registration Protocol [RFC7591] は、OAuth 2.0 クライアントメタデータを 認可サーバーに動的に登録するための API を定義します。[RFC7591] で定義されたメタデータ、および登録されたその拡張は、 Dynamic Client Registration Protocol を使用しない場合でも、 認可サーバー実装に有用なクライアントの一般的なデータ モデルも暗黙に示しています。このような実装には通常、クライアント設定を 管理するための何らかのユーザーインターフェースがあります。本文書では、 特定のクライアントについてプッシュ型認可リクエストが必要かどうかを示すため、 次のクライアントメタデータパラメーターを導入します。

require_pushed_authorization_requests
クライアントが認可リクエストを開始するために 使用を許可される唯一の手段が PAR であるかどうかを示すブール値パラメーター。省略した場合、 デフォルト値は false です。

7. セキュリティに関する考慮事項

7.1. リクエスト URI の推測

攻撃者は、有効なリクエスト URI 値を推測してリプレイし、 対応するクライアントになりすまそうとする可能性があります。 認可サーバーは、リクエスト URI のエントロピーについて JAR [RFC9101], 第 10.2節 の (d) 項で示されている考慮事項を考慮しなければ MUST なりません。

7.2. オープンリダイレクト

攻撃者は、認可コードを取得したりユーザーに対して他の攻撃を 実行したりするため、自身の制御下にあるサイトを指すリダイレクト URI を登録しようとする可能性があります。 認可サーバーは、認証済みクライアントからのプッシュ型認可リクエストに含まれる 新しいリダイレクト URI のみを受け付けなければ MUST なりません。

7.3. リクエストオブジェクトのリプレイ

攻撃者は、正当な 認可リクエストから取得したリクエスト URI をリプレイする可能性があります。このような攻撃に対処するため、 認可サーバーはリクエスト URI を一度限りの使用にするべきです SHOULD。

7.4. クライアントポリシーの変更

リクエストオブジェクトの登録と、 特定のリクエストオブジェクトを使用する 認可リクエストとの間に、クライアントポリシーが変更される可能性があります。そのため、 認可リクエストを処理する際、認可サーバーが リクエストパラメーターをクライアントポリシーと照合することが推奨されます。

7.5. リクエスト URI のすり替え

攻撃者は、あるリクエストからリクエスト URI を取得し、 それを別の認可リクエストに差し替える可能性があります。たとえば OpenID Connect のコンテキストでは、 攻撃者は、高い認証保証レベルを要求するリクエスト URI を、 より低い保証レベルを要求するものに置き換える可能性があります。クライアントは、 この攻撃を防止するため、プッシュされたリクエストオブジェクト内で PKCE [RFC7636]、一意の state パラメーター [RFC6749]、または OIDC の "nonce" パラメーター [OIDC] を使用するべきです SHOULD。

8. プライバシーに関する考慮事項

OAuth 2.0 は、あるエンティティが他の2つの エンティティ間のデータアクセスに対するユーザー認可を仲介するという性質そのものにより、 広範なプライバシー上の影響を持つ複雑で柔軟なフレームワークです。 OAuth 全体のプライバシーに関する考慮事項は、より大きなフレームワーク内の 1つのメッセージシーケンスを開始する代替方法だけを定義する本文書の範囲外です。ただし、 PAR を使用すると、認可リクエストデータを、 ユーザーエージェントを平文で通過する URL のクエリコンポーネントではなく、 HTTP リクエストのメッセージ本文で安全な接続を介してクライアントと認可サーバーの間で直接渡すため、 意図しない情報漏えいの可能性を減らし、プライバシーを向上できる場合があります。

9. IANA に関する考慮事項

9.1. OAuth 認可サーバー メタデータ

IANA は、[RFC8414] によって設立された [IANA.OAuth.Parameters] の IANA "OAuth Authorization Server Metadata" レジストリに次の値を登録しました。

メタデータ名:
pushed_authorization_request_endpoint
メタデータの説明:
認可サーバーのプッシュ型 認可リクエストエンドポイントの URL。
変更管理者:
IESG
仕様文書:
RFC 9126 の 第5節
メタデータ名:
require_pushed_authorization_requests
メタデータの説明:
認可サーバーが PAR を介してのみ認可リクエストを受け付けるかどうかを示します。
変更管理者:
IESG
仕様文書:
RFC 9126 の 第5節

9.2. OAuth 動的クライアント 登録メタデータ

IANA は、[RFC7591] によって設立された [IANA.OAuth.Parameters] の IANA "OAuth Dynamic Client Registration Metadata" レジストリに次の値を登録しました。

クライアントメタデータ名:
require_pushed_authorization_requests
クライアントメタデータの説明:
クライアントが 認可リクエストを開始するために PAR を使用する必要があるかどうかを示します。
変更管理者:
IESG
仕様文書:
RFC 9126 の 第6節

9.3. OAuth URI 登録

IANA は、[RFC6755] によって 設立された [IANA.OAuth.Parameters] の "OAuth URI" レジストリに次の値を登録しました。

URN:
urn:ietf:params:oauth:request_uri:
共通名:
OAuth リクエスト URI 用の URN サブ名前空間。
変更管理者:
IESG
仕様文書:
RFC 9126 の 第2.2節

10. 参考文献

10.1. 規範的参考文献

[RFC2119]
Bradner, S., "RFC で要件レベルを 示すために使用するキーワード", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC6749]
Hardt, D., Ed., "OAuth 2.0 認可 フレームワーク", RFC 6749, DOI 10.17487/RFC6749, , <https://www.rfc-editor.org/info/rfc6749>.
[RFC8174]
Leiba, B., "RFC 2119 キーワードにおける 大文字と小文字の曖昧さ", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
[RFC8259]
Bray, T., Ed., "JavaScript Object Notation (JSON) データ交換形式", STD 90, RFC 8259, DOI 10.17487/RFC8259, , <https://www.rfc-editor.org/info/rfc8259>.
[RFC8414]
Jones, M., Sakimura, N., and J. Bradley, "OAuth 2.0 認可サーバー メタデータ", RFC 8414, DOI 10.17487/RFC8414, , <https://www.rfc-editor.org/info/rfc8414>.
[RFC9101]
Sakimura, N., Bradley, J., and M. Jones, "OAuth 2.0 認可 フレームワーク:JWT で保護された認可リクエスト (JAR)", RFC 9101, DOI 10.17487/RFC9101, , <https://www.rfc-editor.org/info/rfc9101>.

10.2. 参考情報

[IANA.OAuth.Parameters]
IANA, "OAuth パラメーター", <http://www.iana.org/assignments/oauth-parameters>.
[OAUTH-SECURITY-TOPICS]
Lodderstedt, T., Bradley, J., Labunets, A., and D. Fett, "OAuth 2.0 セキュリティの現在のベストプラクティス", 作業中, Internet-Draft, draft-ietf-oauth-security-topics-18, , <https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-18>.
[OAUTH-V2]
Hardt, D., Parecki, A., and T. Lodderstedt, "OAuth 2.1 認可 フレームワーク", 作業中, Internet-Draft, draft-ietf-oauth-v2-1-03, , <https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-03>.
[OIDC]
Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and C. Mortimore, "正誤表セット1を取り込んだ OpenID Connect Core 1.0", , <http://openid.net/specs/openid-connect-core-1_0.html>.
[OIDC.Disco]
Sakimura, N., Bradley, J., Jones, M., and E. Jay, "正誤表セット1を取り込んだ OpenID Connect Discovery 1.0", , <http://openid.net/specs/openid-connect-discovery-1_0.html>.
[RFC6755]
Campbell, B. and H. Tschofenig, "OAuth 用 IETF URN サブ名前空間", RFC 6755, DOI 10.17487/RFC6755, , <https://www.rfc-editor.org/info/rfc6755>.
[RFC7517]
Jones, M., "JSON Web Key (JWK)", RFC 7517, DOI 10.17487/RFC7517, , <https://www.rfc-editor.org/info/rfc7517>.
[RFC7519]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token (JWT)", RFC 7519, DOI 10.17487/RFC7519, , <https://www.rfc-editor.org/info/rfc7519>.
[RFC7523]
Jones, M., Campbell, B., and C. Mortimore, "OAuth 2.0 クライアント認証および 認可グラントのための JSON Web Token (JWT) プロファイル", RFC 7523, DOI 10.17487/RFC7523, , <https://www.rfc-editor.org/info/rfc7523>.
[RFC7591]
Richer, J., Ed., Jones, M., Bradley, J., Machulak, M., and P. Hunt, "OAuth 2.0 動的クライアント登録 プロトコル", RFC 7591, DOI 10.17487/RFC7591, , <https://www.rfc-editor.org/info/rfc7591>.
[RFC7636]
Sakimura, N., Ed., Bradley, J., and N. Agarwal, "OAuth パブリッククライアントによる Proof Key for Code Exchange", RFC 7636, DOI 10.17487/RFC7636, , <https://www.rfc-editor.org/info/rfc7636>.
[RFC8252]
Denniss, W. and J. Bradley, "ネイティブアプリ向け OAuth 2.0", BCP 212, RFC 8252, DOI 10.17487/RFC8252, , <https://www.rfc-editor.org/info/rfc8252>.
[RFC8705]
Campbell, B., Bradley, J., Sakimura, N., and T. Lodderstedt, "OAuth 2.0 相互 TLS クライアント認証および証明書に結び付けられたアクセス トークン", RFC 8705, DOI 10.17487/RFC8705, , <https://www.rfc-editor.org/info/rfc8705>.
[RFC8707]
Campbell, B., Bradley, J., and H. Tschofenig, "OAuth 2.0 のリソースインジケーター", RFC 8707, DOI 10.17487/RFC8707, , <https://www.rfc-editor.org/info/rfc8707>.

謝辞

本仕様は、OpenID Foundation の Financial-grade API Working Group で行われた Pushed Request Object に関する作業に基づいています。WG のメンバーによる 貴重な貢献に感謝します。

本文書に対する貴重なフィードバックを提供してくださった Vladimir Dzhuvinov、 Aaron Parecki、 Justin Richer、 Sascha Preibisch、 Daniel Fett、 Michael B. Jones、 Annabelle Backman、 Joseph Heenan、 Sean Glencross、 Maggie Hung、 Neil Madden、 Karsten Meyer zu Selhausen、 Roman Danyliw、 Meral Shirazipour、 および Takahiko Kawasaki に感謝します。

著者の連絡先

Torsten Lodderstedt
yes.com
Brian Campbell
Ping Identity
Nat Sakimura
NAT.Consulting
Dave Tonge
Moneyhub Financial Technology
Filip Skokan
Auth0