在 golang 中解析/验证来自 AzureAD 的 JWT 令牌

分享于2022年07月17日 azure-active-directory go 问答
【问题标题】:在 golang 中解析/验证来自 AzureAD 的 JWT 令牌(Parse/Validate JWT token from AzureAD in golang)
【发布时间】:2022-02-19 23:19:24
【问题描述】:

我使用 OAuth2 设置了 Azure AD,并让它为我的 Web 应用程序发出 JWT。在后续请求中,我想验证发出的 JWT。我正在使用 github.com/dgrijalva/jwt-go 这样做,但它总是失败。

token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
        return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
    }
    return []byte("bW8ZcMjBCnJZS-ibX5UQDNStvx4"), nil
})
if err != nil {
    return nil, err
}

我从 MS 在此处列出的公钥 https://login.microsoftonline.com/common/discovery/v2.0/keys 中随机选择 kid 声明,所以我迷路了,因为这不起作用。

以前有没有人这样做过或者有什么指点?

  • 您的 keyfunc 正在返回 kid (密钥 ID),而您需要将密钥(在 JWK 文件中的 x5c 节点中)作为 *rsa.PublicKey 返回。 This example 可能会有所帮助。我建议使用 new repo these libraries (包括解析您链接的 JWK 文件的代码)。
  • 谢谢,我似乎到了某个地方,但是当它创建 PublicKey 时,库现在出现“crypto/rsa:验证错误”错误
  • 抱歉 - 您需要使用您现在使用的代码更新您的问题,然后才能提供进一步的帮助。

【解决方案1】:

您正在使用的存储库不再按照自述文件中的说明进行维护。

我一直在使用它的官方替代品 https://github.com/golang-jwt/jwt ,我从未遇到任何问题。你应该试试看。

  • 谢谢,目前正在尝试让 github.com/coreos/go-oidc/v3/oidc 也能正常工作
  • 但是我认为我的主要问题是 JWT 令牌和它使用的签名密钥,lib 可能已经过时但它通常应该可以工作,我认为 AzureAD 有一些特别之处
  • 输入token是如何生成的?你确定它是用 RSA 签名的吗?