展示所有权证明( DPoP )

DPoP 为客户端提供了一种机制,使其能够通过提供公私钥对的持有证明来获取发送者受限的 OAuth 令牌。

该规范处于草案状态: https://datatracker.ietf.org/doc/html/draft-ietf-oauth-dpop-11

HTTP DPoP

DPoP 头是已签名的 JWT ,其中包含用于证明拥有的密钥信息。

DPoP JWT 的 JOSE 头必须至少包含以下参数:

参数 描述
泰普 JWT 的类型。 此值必须为 "dpop + jwt"。
ALG 签名算法。 有效值为: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384和 ES512
JWK 表示公用密钥的 JSON Web 密钥 (JWK)。 不得包含专用密钥。

JOSE 头示例:

{
  "typ": "dpop+jwt",
  "alg": "RS256",
  "jwk": {
    "kty": "RSA",
    "n": "...",
    "e": "AQAB"
  }
}

DPoP JWT 的有效内容必须至少包含以下声明:

声明名称 描述
jti 此 JWT 的唯一标识。
htm HTTP 请求方法,其中包含 JWT。
赫图 HTTP ,不含查询和片段部分。 这将是 "已涂刷授权请求" (PAR) 端点或令牌端点。
iat JWT 的创建时间戳记。

JWT 有效内容示例:

{
  "jti": "3765f59c-43cd-4cf8-8180-73bc9ae4ff3c",
  "htm": "POST",
  "htu": "https://<tenant-hostname>/oauth2/token",
  "iat": 1661847227
}

DPoP JWT 必须使用专用密钥进行签名,并且签名必须可通过 JWT 的 JOSE 头中提供的公用密钥进行验证。 JWT 的有效时间不得超过 30 分钟。 如果没有 exp 声明,那么假定此 JWT 的到期时间是在 iat中指定的创建时间戳记之后 30 分钟。

JWT 在名为 DPoP的头中发送。

请求示例:


curl -ki https://<tenantId>/oauth2/token
 -H "DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6Il..."
 -d "grant_type=client_credentials&client_secret=<secret>&client_id=<clientId>"

Authorize request

授权请求在查询参数或 POST 主体中包含 JSON Web 密钥的指纹。

参数 描述
dpop_jkt 要与此授权请求关联的 JSON Web 密钥的指纹。
https://<tenantId>/oauth2/authorize?grant_type=authorization_code&client_id=<clientId>&redirect_uri=<redirect_uri>&dpop_jkt=<dpop_jkt>&...

为此请求生成的授权代码将绑定到该指纹并在令牌请求中用于验证。 这可防止授权代码被窃取,并由其他不具有相同专用密钥的对象在交换令牌代码时用于对令牌请求进行签名。

建议使用推送授权请求(PAR)请求对象配合, DPoP, 以安全方式发送指纹 dpop_jkt 。 或者,通过 PAR ,可以使用 DPoP 头来代替 dpop_jkt。 请参阅上面的 DPoP HTTP header 部分以获取详细信息。 可以通过在配置 OpenID Connect 应用程序时选择 Require pushed authorization request (PAR) 来实施推送的授权请求。

令牌请求

访问和刷新令牌请求需要包含 DPoP HTTP 标头。 请参阅上面的 DPoP HTTP header 部分以获取详细信息。

对于授权代码流,此 JWK 的指纹必须与授权请求期间发送的 JWK 指纹 (dpop_jkt) 相匹配。

请求示例:


curl -ki https://<tenantId>/oauth2/token
 -H "DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6Il..."
 -d "grant_type=client_credentials&client_secret=<secret>&client_id=<clientId>"

执行此流的结果是与拥有证明绑定的一组令牌。 这可以通过令牌自省进行验证。

令牌自省

当自省 DPoP 访问令牌时,将返回其他声明。
  • token_type: 此值将为 DPoP,而不是 bearer
  • cnf:JWK 指纹确认声明返回公用密钥的散列。
期望自省令牌的客户机通过将公用密钥的散列与自省响应中的 cnf jkt 声明进行比较来验证访问令牌的 DPoP 绑定。

样本自省响应:


{
    ...,
    "cnf": {
        "jkt": "yrFAH18WFPml9e9IIo6rB_fLdFX1pdbMgIcd_fW_4aM="
    },
    "token_type": "DPoP",
    ...
}