jwk = JWT::JWK.import(keyHash) *** ArgumentError 异常:base64 无效

Posted

技术标签:

【中文标题】jwk = JWT::JWK.import(keyHash) *** ArgumentError 异常:base64 无效【英文标题】:jwk = JWT::JWK.import(keyHash) *** ArgumentError Exception: invalid base64 【发布时间】:2020-11-14 20:20:50 【问题描述】:

我正在尝试进行后端苹果登录,它看起来工作良好,直到行 jwk = JWT::JWK.import(keyHash) 它总是返回错误无效 base64。我正在使用 gem jwt 版本 2.2.1 和 Ruby 2.2.4

begin
  header_segment = JSON.parse(Base64.decode64(jwt.split(".").first))
  alg = header_segment["alg"]
  kid = header_segment["kid"]

  apple_response = Net::HTTP.get(URI.parse(GET_PK_APPLE_URL))
  apple_certificate = JSON.parse(apple_response)

  keyHash = ActiveSupport::HashWithIndifferentAccess.new(apple_certificate["keys"].select |key| key["kid"] == kid[0])

  jwk = JWT::JWK.import(keyHash)

  token_data = JWT.decode(jwt, jwk.public_key, true, algorithm: alg)[0]

  if token_data.has_key?("sub") && token_data.has_key?("email") && userIdentity == token_data["sub"]
    puts "Name: " + name + " is validated."
    login_or_create_user('apple')
  else
    render_error
  end
rescue StandardError => e
  render_error
end

【问题讨论】:

您收到什么错误? 【参考方案1】:

我发现了问题,jwt gem 有一个 openssl 依赖项,而 openssl 需要一个来自 Ruby 的更实际的版本,由于其他原因我现在无法更改我的 Ruby 版本,所以我需要更改我的代码以获取没有 JWK使用```JWT::JWK.import(keyHash)````。我还需要使用 UrlSafeBase64 gem。

begin      
  header_segment = JSON.parse(Base64.decode64(jwt.split(".").first))
  alg = header_segment["alg"]
  kid = header_segment["kid"]

  apple_response = Net::HTTP.get(URI.parse(LOGIN_APPLE_URL))
  apple_certificate = JSON.parse(apple_response)

  keyHash = ActiveSupport::HashWithIndifferentAccess.new(apple_certificate["keys"].select |key| key["kid"] == kid[0])      
  key = OpenSSL::PKey::RSA.new
  key.e = OpenSSL::BN.new(UrlSafeBase64.decode64(keyHash["e"]), 2)
  key.n = OpenSSL::BN.new(UrlSafeBase64.decode64(keyHash["n"]), 2)
                  
  token_data = JWT.decode(jwt, key, true, algorithm: alg)[0]
  
  if token_data.has_key?("sub") && token_data.has_key?("email") && userIdentity == token_data["sub"]        
    login_or_create_user('apple')
  else
    render_error
  end
rescue StandardError => e
  render_error
end

【讨论】:

以上是关于jwk = JWT::JWK.import(keyHash) *** ArgumentError 异常:base64 无效的主要内容,如果未能解决你的问题,请参考以下文章

从 azure python sdk JWK 生成 jwcrypto JWK

如何从 RSA 密钥对创建 JWK?

sh 使用openssl为JWT JWK(JSON Web Token JSON Web Key)生成ES512和RS256椭圆曲线密钥对

如何在 Delphi 中将 JSON Web Key 转换为 PEM 格式?

为啥我不能用我的 JWK 签署这些声明?

无法在 Java 中解析 JWK