跳到主要内容

6. Public Key Confirmation (公钥确认)

6. Public Key Confirmation (公钥确认)

资源服务器必须能够可靠地识别访问令牌是否是 DPoP 绑定的,并确定足够的信息以验证与 DPoP 证明的公钥的绑定(参见第 7.1 节)。此类绑定是通过以受保护资源可以访问的方式将公钥与令牌关联来实现的,例如直接将 JWK 哈希嵌入颁发的访问令牌中(使用第 6.1 节中描述的语法),或者通过第 6.2 节中描述的令牌内省。根据授权服务器和受保护资源的协议,还可以使用其他将公钥与访问令牌关联的方法;但是,它们超出了本规范的范围。

支持 DPoP 的资源服务器必须确保 DPoP 证明中的公钥与绑定到访问令牌的公钥匹配。

6.1. JWK 指纹确认方法

当访问令牌表示为 JWT [RFC7519] 时,公钥信息使用此处定义的 jkt 确认方法成员表示。为了在 JWT 中传递公钥的哈希值,本规范引入了以下 JWT 确认方法 [RFC7800] 成员,以便在 cnf 声明下使用。

jkt: JWK SHA-256 指纹确认方法。jkt 成员的值必须是访问令牌绑定的 DPoP 公钥(JWK 格式)的 JWK SHA-256 指纹(根据 [RFC7638])的 base64url 编码(如 [RFC7515] 中定义)。

图 8 中的以下示例 JWT(图 9 中显示了解码的 JWT 有效负载)包含一个带有 jkt JWK 指纹确认方法成员的 cnf 声明。这些示例中的 jkt 值是第 5 节所示示例中 DPoP 证明的公钥哈希值。该示例根据 [RFC8792] 使用 "" 换行。

eyJhbGciOiJFUzI1NiIsImtpZCI6IkJlQUxrYiJ9.eyJzdWIiOiJzb21lb25lQGV4YW1\
wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20iLCJuYmYiOjE\
1NjIyNjI2MTEsImV4cCI6MTU2MjI2NjIxNiwiY25mIjp7ImprdCI6IjBaY09DT1JaTll\
5LURXcHFxMzBqWnlKR0hUTjBkMkhnbEJWM3VpZ3VBNEkifX0.3Tyo8VTcn6u_PboUmAO\
YUY1kfAavomW_YwYMkmRNizLJoQzWy2fCo79Zi5yObpIzjWb5xW4OGld7ESZrh0fsrA

图 8: 包含 JWK SHA-256 指纹确认的 JWT
{
"sub":"[email protected]",
"iss":"https://server.example.com",
"nbf":1562262611,
"exp":1562266216,
"cnf":
{
"jkt":"0ZcOCORZNYy-DWpqq30jZyJGHTN0d2HglBV3uiguA4I"
}
}

图 9: 带有 JWK SHA-256 指纹确认的 JWT 声明集

6.2. 令牌内省中的 JWK 指纹确认方法

"OAuth 2.0 令牌内省" [RFC7662] 定义了一种受保护资源向授权服务器查询访问令牌活动状态的方法。受保护资源还确定关于令牌的元信息。

对于 DPoP 绑定的访问令牌,令牌绑定的公钥的哈希值作为令牌内省响应中的元信息传递给受保护资源。哈希值使用与第 6.1 节中描述的 JWK 指纹确认方法相同的 jkt 成员结构的 cnf 内容进行传递,作为内省响应 JSON 的顶级成员。请注意,资源服务器不随内省请求一起发送 DPoP 证明,并且授权服务器不会在内省端点验证访问令牌的 DPoP 绑定。相反,资源服务器使用内省响应的数据自己在本地验证访问令牌绑定。

如果内省响应中包含 token_type 成员,则它必须包含值 DPoP。

图 10 中的示例内省请求和图 11 中的相应响应说明了在该示例中颁发的 DPoP 绑定访问令牌的内省交换(如图 6 所示)。

POST /as/introspect.oauth2 HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic cnM6cnM6TWt1LTZnX2xDektJZHo0ZnNON2tZY3lhK1Rp

token=Kz~8mXK1EalYznwH-LC-1fBAo.4Ljp~zsPE_NeO.gxU

图 10: 示例内省请求
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{
"active": true,
"sub": "[email protected]",
"iss": "https://server.example.com",
"nbf": 1562262611,
"exp": 1562266216,
"cnf":
{
"jkt": "0ZcOCORZNYy-DWpqq30jZyJGHTN0d2HglBV3uiguA4I"
}
}

图 11: DPoP 绑定访问令牌的内省响应示例