关于 azure:id_token 在调用刷新令牌时格式错误

id_token is malformed when calling refresh token

作为 Azure API 管理设置的一部分,我们将 oAuth 2.0 与 Active Directory 结合使用。

我们正在使用 id_token (JWT) 进行身份验证,效果很好。

我们可以通过重定向 url(微软登录)请求一个 id_token,这个令牌可以用来成功调用我们的 API(再次验证我们的 API 策略)。

当我们要刷新token时出现问题。

我们遵循以下流程:
https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-code#refreshing-the-access-tokens

Refresh

如您所见,我得到了一个 id_token(因为传递了范围 openid),但问题是,id_token 格式错误。

而不是由 3 个部分组成,例如AAAA.BBBB.CCCC

返回的 id_token,只有 2 部分(缺少签名),例如AAAA.BBBB.

当使用这个 id_token 进行身份验证时,它显然失败了:(


我不确定为什么 id_token 只有两部分,但它不是您应该发送以授权请求的访问令牌吗?也许 id_token 更早工作是因为它是由适当的授权服务器签名的,但应该一直是访问令牌?毕竟应该刷新的是访问令牌。

我假设您在最初获得有效的 id_token、access_token 和 refresh_token 时发送了 "offline_access" 作为您的范围之一,或者您不应该收到 refresh_token。 https://www.rfc-editor.org/rfc/rfc6749#section-6 说,如果您在刷新请求中提供范围,则您的访问令牌不应限于刷新中提供的范围要求。 openid 连接规范 (http://openid.net/specs/openid-connect-core-1_0.html#RefreshTokenResponse) 说刷新请求类似于令牌请求,只是它"可能不包含 id_token"。在我看来,除非它是 Azure 中特定于实现的功能,否则在刷新响应中期望 id_token 时,所有的赌注都没有了。

更新
来自 https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols-oauth-code#refresh-the-access-token

"id_token--一个未签名的 JSON 网络令牌 (JWT)。应用程序可以 base64Url 解码此令牌的片段以请求有关登录用户的信息。应用程序可以缓存这些值并显示它们,但它应该不要依赖它们来获得任何授权或安全边界。有关 id_tokens 的更多信息,请参阅 v2.0 端点令牌参考。"

请注意它没有签名。那是你缺少的 jwt 的第三部分。