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

li9yvcax  于 2022-09-21  发布在  Ruby
关注(0)|答案(1)|浏览(234)

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

引发的错误为JWT::VerificationError (Signature verification raised)

下面是我的完整代码,经过编辑后可以作为脚本运行,因此可以将其复制/粘贴到终端中。它基于Auth0实现。

常量My_Super_Secure_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设置非常相似。

我是否遗漏了什么明显的基本步骤?谢谢

vuktfyat

vuktfyat1#

我通过以下内容验证了来自Azure的JWT。还可以考虑使用建议的解决方案here

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})

相关问题