使用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"
}
答案 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验证声明:
resource
,以及令牌声明中的aud
) RS256
)。kid
标头值作为提示)。-----END CERTIFICATE-----
结尾(我发现jwt.io并不太关心它是如何开始的。