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

时间:2017-07-11 15:23:39

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

使用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 个答案:

答案 0 :(得分:1)

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

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

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

如果您在授权请求中添加scope=openid,那么您将向Azure AD暗示您对了解登录人员的内容或多或少感兴趣,并且您将获得未签名的OpenID在响应中连接ID令牌。

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

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