如何验证 Azure 活动目录中刷新的 id_token 的签名

How to verify signature of refreshed id_token in Azure active directory

我们正在使用 Azure 活动目录 Oauth 代码流对用户进行身份验证。 我们使用代码获得了 access_token、id_token 和 refresh_token(在重定向 URL 上获得)。 我们使用 id_token 在成功验证后授权每个请求,我们可以使用从 /discovery/v2.0/keys api.

获得的 public 密钥验证 JWT

现在,JWT 将在 1 小时后过期。所以我们需要刷新这个 id_token.

我正在刷新 id_token 使用下面的 cURL

 curl --request POST \
  --url https://login.microsoftonline.com/{tenant_id}/oauth2/token \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data 'client_id=client%20id&refresh_token=refesh%20token%20&grant_type=refresh_token&client_secret=client_secret&scope=openid

在这个API的响应中,我们得到了access_token、refresh_token、id_token,但是如果你观察id_token,它并没有包含JWT签名(JWT的第三部分),没有签名我们无法验证JWT

我们找不到任何文档参考,为什么 id_token 没有签名部分。 有没有其他方法可以刷新id_token? 如果 id_token 无法刷新,有什么解决方法吗?

在某些情况下,Id 令牌可能会在没有签名的情况下返回,特别是如果它是通过带有客户端机密的反向通道获取的。 您已经通过加密通道从权威机构获取令牌。 如果有人能够在那里注入一些东西,他们也能够引导您的应用程序对 OpenID 元数据的请求,从而替换您的应用程序期望的签名密钥。 因此签名在这里不会增加太多价值。

此外,您不会将 Id 令牌发送给任何 API,因为 Id 令牌不应用于授权。 这就是访问令牌的用途:)

OpenID Connect 规范是这样说的:https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation

If the ID Token is received via direct communication between the Client and the Token Endpoint (which it is in this flow), the TLS server validation MAY be used to validate the issuer in place of checking the token signature. The Client MUST validate the signature of all other ID Tokens according to JWS [JWS] using the algorithm specified in the JWT alg Header Parameter. The Client MUST use the keys provided by the Issuer.

但是,有趣的是还提到了这一点:https://openid.net/specs/openid-connect-core-1_0.html#IDToken

ID Tokens MUST be signed using JWS and optionally both signed and then encrypted using JWS and JWE respectively, thereby providing authentication, integrity, non-repudiation, and optionally, confidentiality, per Section 16.14. If the ID Token is encrypted, it MUST be signed then encrypted, with the result being a Nested JWT, as defined in [JWT]. ID Tokens MUST NOT use none as the alg value unless the Response Type used returns no ID Token from the Authorization Endpoint (such as when using the Authorization Code Flow) and the Client explicitly requested the use of none at Registration time.

所以..可能是 Azure AD 不符合规范?

编辑:Azure AD 的 v1 端点在这方面不合规。较新的 v2 端点完全符合 OpenID Connect 标准。