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
sh 使用openssl为JWT JWK(JSON Web Token JSON Web Key)生成ES512和RS256椭圆曲线密钥对