【问题标题】:Invalid signature while validating Azure ad access token验证 Azure 广告访问令牌时签名无效
【发布时间】:2017-12-15 18:12:08
【问题描述】:

我在使用 jwt.io 验证我的 azure 广告访问令牌时收到无效签名(在手动检查后将转换为 scala 代码)。

我正在使用 curl 生成访问令牌:

curl -s -X POST https://login.microsoftonline.com/<tenant id>/oauth2/token -d grant_type=password -d username=$username -d password=$pass  -d resource=$resID -d client_id=$id -d client_secret=$key

虽然它给了我访问令牌,但响应不包含“Id_token”。不知道为什么。

我正在使用 BEGIN 和 END 证书包装来自 https://login.microsoftonline.com/common/discovery/keys 的公钥。 (如https://nicksnettravels.builttoroam.com/post/2017/01/24/Verifying-Azure-Active-Directory-JWT-Tokens.aspx中提到的)

我不确定还缺少什么。

解码后的header如下:

{
  "typ": "JWT",
  "alg": "RS256",
  "x5t": "9FXDpbfMFT2SvQuXh846YTwEIBw",
  "kid": "9FXDpbfMFT2SvQuXh846YTwEIBw"
}

【问题讨论】:

  • 可以分享一下解码后的访问令牌吗?
  • 我已经添加了标题。你到底想要什么?

标签: azure oauth-2.0 azure-active-directory


【解决方案1】:

警告:您正在调用的流不受支持,将在不久的将来被删除。

Azure AD 不支持资源所有者密码凭据授予流程 (grant_type=password) 与机密客户端(即存在 client_secret 的 Web 应用程序/Web API)。如果您确信您的场景需要资源所有者流程(很少有场景真正保证此流程引入的风险),那么您应该使用为本地客户端应用程序(公共客户端)注册的 client_id 来调用它。或者,您应该调用交互式登录(如果您正在登录实际的人类用户),或执行客户端凭据授予流程(如果这是一个守护程序/无人值守服务)。

您没有获得 ID 令牌,因为您调用的流程(OAuth 2.0 资源所有者密码凭据授予流程)未定义任何 ID 令牌概念或 id_token 响应。换句话说:你还没有要一个。

如果您将scope=openid 添加到您的授权请求中,您将向 Azure AD 暗示您或多或少有兴趣了解有关登录者的信息,并且您将获得一个未签名的 OpenID Connect ID响应中的令牌。

https://jwt.io 验证声明:

  1. 确保这是为您准备的令牌。 (即不要期望能够解码和验证不适合您的令牌(其中“您”是授权请求中的resource,以及令牌声明中的aud)。
  2. 确保您选择了正确的签名算法 (RS256)。
  3. 确保检查用于签署令牌的密钥(使用 JWT 中的 kid 标头值作为提示)。
  4. 确保证书以 -----END CERTIFICATE----- 结尾(我发现 jwt.io 不太关心它是如何开始的。
  5. 仔细检查您的复制粘贴,很容易意外拾取多余的字符。

【讨论】:

  • 感谢您的快速响应。我使用资源所有者密码凭据授予流程的唯一原因是目前我只想检查 jwt 令牌的身份验证。我假设访问我的 API 的用户将通过交互式登录获得访问令牌。
  • 我们甚至可以验证访问令牌吗?根据stackoverflow.com/questions/41482513/…,我们无法验证访问令牌。
  • 我还有一个关于我的场景要采用的流程的问题。我有一个独立的休息 api,我只想验证想要访问我的 api 的用户。应该使用哪个流程?
猜你喜欢
  • 2018-01-01
  • 2021-08-10
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2011-10-25
  • 2021-01-21
  • 2021-11-12
相关资源
最近更新 更多