| RFC 9126 | OAuth PAR | 2021年9月 |
| Lodderstedt 等 | 标准轨道 | [页] |
本文档定义了推送授权请求(PAR)端点,该端点允许 客户端通过直接请求将 OAuth 2.0 授权请求的有效载荷推送到 授权服务器,并为它们提供 一个请求 URI,该 URI 用作在 后续调用授权端点时对数据的引用。¶
这是一个互联网标准轨道文档。¶
本文档是互联网工程任务组 (IETF)的产物。它代表了 IETF 社区的共识。它已经 过公开审查,并已由 互联网工程指导组(IESG)批准发布。关于 互联网标准的更多信息可参见 RFC 7841 第 2 节。¶
有关本文档当前状态、任何 勘误以及如何提供反馈的信息,可在 https://www.rfc-editor.org/info/rfc9126 获取。¶
Copyright (c) 2021 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.¶
本文档定义了推送授权请求(PAR)端点,它使 OAuth [RFC6749] 客户端 能够将授权请求的有效载荷直接推送到 授权服务器。作为交换会收到一个请求 URI 值;该值用作 授权请求有效载荷数据的引用,供随后通过用户代理调用授权端点时使用 。¶
在 OAuth [RFC6749] 中,授权 请求参数通常作为 URI 查询 参数通过用户代理中的重定向发送。这很简单,但也带来了一些挑战:¶
JWT 安全授权请求(JAR)[RFC9101] 通过允许
OAuth 客户端将授权请求参数包装在 Request Object 中,为这些安全挑战提供了解决方案;Request Object 是
一个已签名且可选加密的 JSON Web Token(JWT)[RFC7519]。
为了应对大小限制,JAR 引入了 request_uri 参数,允许客户端
发送对 Request Object 的引用,而不是发送 Request Object 本身。¶
本文档通过提供一种可互操作的方式来补充 JAR,使得
授权请求的有效载荷可以直接推送到授权服务器,以换取一个
可在后续授权请求中用于授权服务器的 request_uri
值。¶
PAR 通过为客户端提供一种简单方式来实现机密且 受完整性保护的授权请求,从而增强 OAuth 安全性。需要更高安全级别的客户端,尤其是 需要以密码学方式确认的不可否认性的客户端,能够按 [RFC9101] 中定义的方式结合 PAR 使用基于 JWT 的 Request Object。¶
PAR 允许授权服务器在任何用户 交互发生之前对客户端进行认证。 在授权过程中对客户端身份的信心提高,使 授权服务器能够在流程中更早拒绝非法请求,这可以防止 伪装客户端,或以其他方式篡改或滥用授权请求的企图。¶
注意,如 [RFC6749] 第 3.1 节 和
[OIDC] 第 3.1.2.1 节所述,也可以使用经由用户代理
发往授权端点的 HTTP POST 请求来应对上述
请求大小限制。然而,根据 [RFC6749],这只是可选的;即使被支持,它对
传统 Web 应用而言是可行选项,但对已安装的移动应用来说使用起来极其困难。
如 [RFC8252] 所述,这些应用使用
平台特定 API 在系统浏览器中打开授权请求 URI。然而,当移动应用
启动浏览器时,生成的初始请求被限制为使用 GET
方法。使用 POST 发出授权请求将要求应用首先让
浏览器通过 GET 打开一个由应用控制的 URI,同时以某种方式传递庞大的
授权请求有效载荷,然后让生成的响应包含用于
向授权服务器发起跨站表单 POST 的内容和脚本。PAR 更易于使用,
并且如上所述具有额外的安全优势。¶
在传统 OAuth 2.0 中,客户端通常通过 指示用户代理向授权服务器的授权端点发出类似下面的 HTTP 请求, 来发起授权 请求(额外的换行和缩进仅用于显示 目的):¶
客户端可以改为通过
POST 请求将此类请求直接推送到授权服务器的 PAR 端点,如下面的
示例所示(额外的换行和空格仅用于显示目的)。
客户端可以进行认证(例如,如示例中所示使用基于 JWT 客户端断言的认证),
因为该请求是直接发往授权服务器的。¶
授权服务器以一个请求 URI 作为响应:¶
客户端使用该请求 URI 值来创建后续授权 请求,方式是指示用户代理向授权服务器的 授权端点发出类似下面的 HTTP 请求(额外的换行和缩进仅用于显示 目的):¶
本文档中的关键词“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] 中定义的术语“access token”、 “authorization server”、“authorization endpoint”、 “authorization request”、“token endpoint” 和 “client”。¶
客户端 MAY 使用 JAR [RFC9101] 中定义的
request 参数,将 Request Object JWT 推送到
授权服务器。JAR [RFC9101] 中定义的 Request Object 处理、签名和加密规则
适用。给定客户端认证方法所需的请求参数会直接包含在
application/x-www-form-urlencoded
请求中,并且是表单体中除 request 之外的唯一参数(例如,
mutual TLS 客户端认证 [RFC8705] 使用
client_id HTTP 请求参数,而基于 JWT 断言的客户端认证 [RFC7523] 使用 client_assertion 和
client_assertion_type)。所有其他请求参数,即与
授权请求本身相关的参数,MUST 作为表示
授权请求的 JWT 的声明出现。¶
以下是使用已签名 Request Object 的推送授权请求示例,其授权请求有效载荷与 第 2.1 节 中示例相同。客户端使用基于 JWT 客户端断言的 认证 [RFC7523] 进行认证(额外的换行和空格 仅用于显示目的):¶
除 第 2.1 节 中定义的处理规则之外, 授权服务器 MUST 采取以下步骤:¶
client_id 与 Request Object 中的
client_id 声明不匹配时,拒绝该请求。此外,是否要求 iss
声明与 client_id 匹配,由授权服务器自行决定。¶
以下 RSA 密钥对以 JSON Web Key(JWK)格式 [RFC7517] 表示, 可用于验证或重新创建上述示例中的 Request Object 签名(值中的额外换行和缩进仅用于 显示目的):¶
{
"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"
}
¶
引入以下授权服务器元数据参数 [RFC8414],用于传达服务器关于 PAR 的能力和策略。¶
request_uri 值。¶
false。¶
注意,存在 pushed_authorization_request_endpoint
已足以让客户端确定它可以使用 PAR 流程。从 PAR 端点获得的
request_uri 值可在授权端点使用,而不受其他授权
服务器元数据影响,例如 request_uri_parameter_supported 或
require_request_uri_registration [OIDC.Disco]。¶
动态客户端注册协议 [RFC7591] 定义了一个 API,用于向授权服务器动态注册 OAuth 2.0 客户端 元数据。[RFC7591] 定义的元数据及其已注册扩展,也蕴含了一个通用的客户端 数据模型,即使未使用动态客户端注册协议,该模型对授权服务器实现也很有用。 这类实现通常会提供某种用户 界面来管理客户端配置。本文档引入以下客户端元数据参数, 用于指示给定客户端是否要求使用推送授权请求。¶
false。¶
攻击者可能尝试猜测并重放有效的请求 URI 值,并 试图冒充相应客户端。 授权服务器 MUST 考虑 JAR [RFC9101], 第 10.2 节 中关于 request URI 熵的第(d)项考量。¶
OAuth 2.0 是一个复杂且灵活的框架,由于其本质上让一个实体在 另外两个实体之间介入用户授权以访问数据,因此具有广泛的隐私影响。 整个 OAuth 的隐私考量超出了本文档范围;本文档 仅定义了在更大框架中发起一个消息序列的替代方式。然而, 使用 PAR 可能会通过降低无意信息披露的可能性来改善隐私, 因为它通过安全连接在 HTTP 请求消息体中直接在客户端和授权服务器之间 传递授权请求数据,而不是在以明文通过用户代理的 URL 查询组件中 传递这些数据。¶
IANA 已在由 [RFC7591] 建立的 [IANA.OAuth.Parameters] 的 IANA “OAuth Dynamic Client Registration Metadata”注册表中注册以下值。¶
IANA 已在由 [RFC6755] 建立的 [IANA.OAuth.Parameters] 的“OAuth URI”注册表中注册以下值。¶
本规范基于 OpenID Foundation 的 Financial-grade API Working Group 开展的 Pushed Request Object 工作。我们感谢该工作组成员的宝贵贡献。¶
我们感谢 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 对本文档提出的宝贵反馈。¶