如何在 Ruby 中验证 Azure AD 的 JWT 访问令牌

4

我正在拼命尝试验证Azure AD的JWT访问令牌。

引发的错误是 JWT::VerificationError (签名验证错误)

以下是我的代码,完整地编辑为脚本形式,以便可以复制/粘贴到终端中。 它基于Auth0实现。

常量MY_SUPER_SECRET_ACCESS_TOKEN需要设置为Azure AD的访问令牌。

require 'net/http'
require 'uri'

access_token = MY_SUPER_SECRET_ACCESS_TOKEN

jwks_raw = Net::HTTP.get URI('https://login.microsoftonline.com/common/discovery/v2.0/keys')

jwks_hash = Hash[
      jwks_keys
      .map do |k|
        [
          k['kid'],
          OpenSSL::X509::Certificate.new(
            Base64.decode64(k['x5c'].first)
          ).public_key
        ]
      end
    ]

token_info = JWT.decode(access_token, nil, false, {algorithm: 'RS256'})

cert_public_key = jwks_hash[token_info[1]['kid']]

JWT.decode(access_token, cert_public_key, true, algorithms: 'RS256')

出现了签名错误?我不是很擅长这方面的知识,我们正在使用与此非常相似的设置的Auth0。

我是否错过了一些显而易见的基本步骤?谢谢。


你应该先阅读 Ruby JWT 文档。这里 你可以找到首选的 kid 验证。 - Gianpaolo Scrigna
2个回答

1
我能够通过以下方法验证来自Azure的JWT。还可以尝试使用这里提供的解决方案。
id_token # issuer https://login.microsoftonline.com/{tenant-id}/v2.0

jwks = JSON.parse(Net::HTTP.get URI('https://login.microsoftonline.com/common/discovery/v2.0/keys'))

JWT.decode(id_token, nil, true, { algorithms: ['RS256'], jwks: jwks})

是的,这适用于ID令牌。您提供的链接看起来很有前途,因为访问令牌可以在MS令牌验证器上进行验证,但JWT.io无法验证。 - Romuloux

0
作为对这个问题的跟进,这里是文档不太清楚的地方。
与标准oauth相比,MS使用了不同的解释来说明信息和id和access令牌所起的作用。
我无法验证任何访问令牌的原因是它们由MS签名,并且只能用于验证对MS api的访问。它们对于验证身份验证到您的API将没有任何用处。
这也是为什么ID令牌可以验证,因为它由您的应用程序签名,可以用于对您自己的API进行身份验证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接