当前位置: 首页 > 知识库问答 >
问题:

验证Azure ad访问令牌时签名无效

尉迟墨竹
2023-03-14

我在使用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 所述)

我不确定还缺少什么。

解码后的报头如下:

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

共有1个答案

林绪
2023-03-14

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

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

您不会获得ID令牌,因为您调用的流(OAuth 2.0资源所有者密码凭证授权流)没有定义ID令牌的任何概念,也没有定义< code>id_token响应。换句话说:你没有要求过。

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

要 https://jwt.io 验证声明,请执行以下操作:

  1. 确保这是适合您的令牌。(即,不要期望能够解码和验证不适合您的令牌(其中“您”是授权请求中的资源,令牌声明中的 aud)。
  2. 确保选择了正确的签名算法 (RS256)。
  3. 确保检查用于对令牌进行签名的密钥(使用 JWT 中的 kid 标头值作为提示)。
  4. 确保证书以-----END CERTIFICATE-----结尾(我发现 jwt.io 不太关心它是如何开始的。
  5. 仔细检查您的复制粘贴,很容易意外拾取多余的字符。
 类似资料:
  • 文件上说https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html 必须验证访问令牌。如何验证令牌?

  • 我目前正在使用Vapor开发Swift后端。我的iOS客户端使用新的iOS 13功能“使用Apple登录”。当用户登录时,我会得到一个身份令牌(访问令牌),这是一个由Apple签名的有效JWT令牌。这将在所有正在进行的通信中发送到服务器,以验证服务器提供的某些路由。 在服务器上,我想通过验证令牌签名来验证发送的令牌是否确实由Apple签名,并且不是由某些恶意用户专门创建的。Apple提供了一个HT

  • 我正在使用Auth0并尝试通过调用Microsoft标识平台来验证Signature,但我在调用验证方法时收到了下面的错误。还请找到我的代码片段。 代码段: 错误 通用域名格式。auth0.jwt。例外情况。SignatureVerificationException:在com上使用算法SHA256withRSA验证时,令牌的签名无效。auth0.jwt。算法。RSA算法。在com上验证(rsaa

  • 当且仅当用户在发出OAuth2请求时登录到LinkedIn时,它才起作用。 如果用户未登录,则会遇到错误。 我们的行动顺序: 成功获取新的访问令牌 使用访问令牌,发布到apiendpoint 之后,我们将收到一份401,内容如下: 有时,经过一段时间后,使用相同的访问令牌重试会得到200。有时不会。 如果用户在“401期间”登录LinkedIn,那么之前获取的访问令牌就会神奇地开始工作。 我不知道

  • 我正在制作一个javascript客户端,它使用JWT令牌连接到Api。在服务器端没有问题,我可以创建令牌对其进行签名,然后验证签名,从而确保没有人篡改令牌。 但我如何在客户端做到这一点。我可以解码JWT令牌并查看头、负载和签名。但是如何在客户端验证签名?是否有用于此的库,如何将公钥传输到客户端? 如果我不验证签名,我怎么知道令牌没有被篡改?

  • 我正在使用以下示例来玩Spring Cloud OAuth2实现: https://github.com/spring-cloud-samples/authserver https://github.com/spring-cloud-samples/sso 第一个是OAuth服务器,它在对用户进行身份验证时生成JWT令牌。第二个是正在被消耗的资源。根据OAuth规范,资源将用户的身份验证转发给au