跳到主要内容

10. Authorization Code Binding to a DPoP Key (授权码与 DPoP 密钥的绑定)

10. Authorization Code Binding to a DPoP Key (授权码与 DPoP 密钥的绑定)

将颁发给客户端的授权码绑定到其所有权证明密钥,可以实现整个授权流程的端到端绑定。本规范为此目的定义了 dpop_jkt 授权请求参数。dpop_jkt 授权请求参数的值是使用 SHA-256 哈希函数的所有权证明公钥的 JWK 指纹 [RFC7638],该值与第 6.1 节定义的 jkt 确认方法使用的值相同。

收到令牌请求时,授权服务器计算 DPoP 证明中所有权证明公钥的 JWK 指纹,并验证它是否与授权请求中的 dpop_jkt 参数值匹配。如果不匹配,它必须拒绝该请求。

下面显示了使用 dpop_jkt 授权请求参数的示例授权请求,并根据 [RFC8792] 使用 "" 换行。

GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz\
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb\
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM\
&code_challenge_method=S256\
&dpop_jkt=NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs HTTP/1.1
Host: server.example.com

图 25: 使用 dpop_jkt 参数的授权请求

使用 dpop_jkt 授权请求参数是可选的。请注意,dpop_jkt 授权请求参数也可以与用于代码交换的证明密钥 (PKCE) [RFC7636] 结合使用,[SECURITY-TOPICS] 建议将其作为授权码注入的对策。仅当每个授权请求使用唯一的 DPoP 密钥时,dpop_jkt 授权请求参数才提供类似的保护。

10.1. DPoP 与推送授权请求 (PAR)

当推送授权请求 (PAR) [RFC9126] 与 DPoP 结合使用时,有两种方法可以在 PAR 请求中传达 DPoP 密钥:

  • 可以使用第 10 节中描述的 dpop_jkt 参数将颁发的授权码绑定到特定密钥。在这种情况下,dpop_jkt 必须与 PAR 请求的 POST 正文中的其他授权请求参数一起包含。
  • 或者,可以将 DPoP 头部添加到 PAR 请求中。在这种情况下,授权服务器必须按照第 4.3 节的定义检查提供的 DPoP 证明 JWT。它必须进一步表现得就像包含的公钥的指纹是使用 dpop_jkt 提供的一样,即除非提供相同密钥的 DPoP 证明,否则拒绝后续的令牌请求。这有助于简化客户端的实现,因为它可以“盲目地”将 DPoP 头部附加到对授权服务器的所有请求,而不管请求的类型如何。此外,它提供了更强的绑定,因为 DPoP 头部包含私钥所有权的证明。

支持 PAR 和 DPoP 的授权服务器必须支持这两种机制。如果同时使用这两种机制,如果 dpop_jkt 中的 JWK 指纹与 DPoP 头部中的公钥不匹配,授权服务器必须拒绝该请求。

允许这两种机制可确保使用 dpop_jkt 的客户端不需要区分前通道和推送授权请求,同时,对于保护所有对授权服务器端点的调用只有一个代码路径的客户端,也不需要区分对 PAR 端点的请求和令牌端点的请求。