我在使用 jwt.io 验证我的 azure 广告访问 token 时收到无效签名(手动检查后将转换为 scala 代码)。
我正在使用curl来生成访问 token :
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
虽然它为我提供了访问 token ,但响应不包含“Id_token”。不知道为什么。
我正在包装来自 https://login.microsoftonline.com/common/discovery/keys 的公钥带有 BEGIN 和 END 证书。 (如 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 AD 中不支持使用 secret 客户端(即 Web 应用/Web API,其中存在 client_secret
)的资源所有者密码凭据授予流程 (grant_type=password
) >)。如果您确信您的场景需要资源所有者流程(很少有场景实际上保证此流程引入的风险),那么您应该使用为 native 客户端应用程序(公共(public)客户端)注册的 client_id
来调用它。客户)。或者,您应该调用交互式登录(如果您正在登录实际的人类用户),或执行客户端凭据授予流程(如果这是守护程序/无人值守服务)。
您没有获得 ID token ,因为您调用的流程(OAuth 2.0 资源所有者密码凭证授予流程)未定义 ID token 或 id_token
响应的任何概念。换句话说:你还没有要求过。
如果您将 scope=openid
添加到您的授权请求中,您将向 Azure AD 暗示您或多或少有兴趣了解有关登录者和您的信息。将在响应中获得未签名的 OpenID Connect ID token 。
致https://jwt.io验证声明:
- 确保这是为您准备的 token 。 (即,不要期望能够解码和验证不适合您的 token (其中“您”是授权请求中的
资源
,而aud
在 token 声明中)。 - 确保您选择了正确的签名算法 (
RS256
)。 - 确保您正在检查用于签署 token 的 key (使用 JWT 中的
kid
header 值作为提示)。 - 确保证书以
-----END CERTIFICATE-----
结尾(我发现 jwt.io 不太关心它是如何开始的。 - 仔细检查您的复制粘贴,很容易意外拾取多余的字符。
关于azure - 验证 Azure 广告访问 token 时签名无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45038651/