跳到主要内容

1. Introduction (简介)

1. Introduction (简介)

本文档定义推送式授权请求 (pushed authorization request, PAR) 端点, 它使 OAuth [RFC6749] 客户端能够将授权请求的载荷直接推送到授权服务器. 作为交换, 会收到一个 request URI 值; 在用户代理随后对授权端点的调用中, 该值用作对授权请求载荷数据的引用.

在 OAuth [RFC6749] 中, 授权请求参数通常作为 URI 查询参数通过用户代理重定向发送. 这很简单, 但也会带来挑战:

  • 没有密码学上的完整性与真实性保护. 例如, 攻击者可以修改所请求的访问范围 (scope), 或通过更改 scope 值调换支付交易的上下文. 尽管协议机制可以使客户端或用户检测部分此类变更, 在流程早期阻止修改是更稳健的解决方案.

  • 没有机制保证请求参数的机密性. 尽管授权端点要求使用 HTTPS, 请求数据仍以明文形式经过用户代理, 查询串数据可能无意中泄漏到 Web 服务器日志以及通过 Referer 泄漏到其他站点. 若授权请求中发送个人身份信息或其他受监管数据 (在身份, 开放银行等场景中很可能如此), 此类泄漏的影响可能很大.

  • 授权请求 URL 可能变得相当大, 尤其在需要细粒度授权数据的场景中, 可能导致请求处理错误.

JWT-Secured Authorization Request (JWT 保护的授权请求, JAR) [RFC9101] 通过允许 OAuth 客户端将授权请求参数封装在 Request Object (请求对象) 中来应对安全挑战; Request Object 是一种经签名且可选加密的 JSON Web Token (JSON Web令牌, JWT) [RFC7519]. 为应对大小限制, JAR 引入 request_uri 参数, 使客户端可以发送对 Request Object 的引用, 而非 Request Object 本身.

本文档通过提供一种可互操作的方式, 将授权请求的载荷直接推送到授权服务器以换取可在后续授权请求中于授权服务器处使用的 request_uri 值, 从而对 JAR 形成补充.

PAR 通过为客户端提供一种简单手段, 使授权请求具有机密性与完整性保护, 从而促进 OAuth 安全. 需要更高安全级别, 尤其是密码学上可确认不可否认性的客户端, 能够按 [RFC9101] 所定义将基于 JWT 的 Request Object 与 PAR 结合使用.

PAR 允许授权服务器在任何用户交互发生之前认证客户端. 在授权过程中对客户端身份更高的置信度, 使授权服务器能够更早拒绝不合法请求, 从而有助于防止伪装客户端或以其他方式篡改或滥用授权请求的企图.

请注意, 经由用户代理向授权端点发送 HTTP POST 请求 (如 [RFC6749] 第 3.1 节与 [OIDC] 第 3.1.2.1 节所述) 也可用于应对上述请求大小限制. 然而, 按 [RFC6749] 这仅是可选的; 即便支持, 它对常规 Web 应用可行, 但对已安装移动应用却极难使用. 如 [RFC8252] 所述, 这些应用使用平台相关 API 在系统浏览器中打开授权请求 URI. 然而, 当移动应用启动浏览器时, 所产生的初始请求被限制为必须使用 GET 方法. 对授权请求使用 POST 将要求应用首先通过 GET 让浏览器打开应用所控制的 URI, 同时以某种方式传递庞大的授权请求载荷, 然后使响应包含内容与脚本来向授权服务器发起跨站表单 POST. PAR 更易于使用, 并具有上文所述的额外安全益处.

参见 1.1. Introductory Example (导引示例)1.2. Conventions and Terminology (约定与术语).