ruby-jwt编码,用RS256算法解码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby-jwt编码,用RS256算法解码相关的知识,希望对你有一定的参考价值。

在RSA256算法中编码和解码令牌时,似乎我们总是初始化并使用相同的私钥:

payload = {:data => 'test'}
rsa_private = OpenSSL::PKey::RSA.generate 2048
rsa_public = rsa_private.public_key

token = JWT.encode payload, rsa_private, 'RS256'
# eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ0ZXN0IjoiZGF0YSJ9.c2FynXNyi6_PeKxrDGxfS3OLwQ8lTDbWBWdq7oMviCy2ZfFpzvW2E_odCWJrbLof-eplHCsKzW7MGAntHMALXgclm_Cs9i2Exi6BZHzpr9suYkrhIjwqV1tCgMBCQpdeMwIq6SyKVjgH3L51ivIt0-GDDPDH1Rcut3jRQzp3Q35bg3tcI2iVg7t3Msvl9QrxXAdYNFiS5KXH22aJZ8X_O2HgqVYBXfSB1ygTYUmKTIIyLbntPQ7R22rFko1knGWOgQCoYXwbtpuKRZVFrxX958L2gUWgb4jEQNf3fhOtkBm1mJpj-7BGst00o8g_3P2zHy-3aKgpPo1XlKQGjRrrxA
puts token

decoded_token = JWT.decode token, rsa_public, true, { :algorithm => 'RS256' }

# Array
# [
#   {"data"=>"test"}, # payload
#   {"alg"=>"RS256"} # header
# ]
puts decoded_token

但是在Rails 5.1应用程序中,最好的方法是什么?

答案

我想出了如何解决这个问题。所以我有一个类JsonWebTokenwith 2类方法:encodeand decodedefined如下:

class JsonWebToken

  ALGO = 'RS256'

  class << self

    def encode(payload, exp = 2.hours.from_now)
      # set expiry to 2 hours from creation time
      payload[:exp] = exp.to_i
      JWT.encode(payload, private_key, ALGO)
    end

    def decode(token)
      body = JWT.decode(token, private_key.public_key, true, algorithm: ALGO)[0]
      HashWithIndifferentAccess.new body
      # rescue from expiry exception
    rescue JWT::ExpiredSignature, JWT::VerificationError => e
      # raise custom error to be handled by custom handler
      raise ExceptionHandler::ExpiredSignature, e.message
    end  

    private

      def private_key
        @rsa_private ||= OpenSSL::PKey::RSA.generate 2048
      end
  end

end

我只是使用另一个私有静态方法来生成rsa私钥(如果需要)。

以上是关于ruby-jwt编码,用RS256算法解码的主要内容,如果未能解决你的问题,请参考以下文章

使用 RS256 生成的 JWT 可以被 jwt.io 网站解码吗?

解码 Base64urlUInt 编码的值

python base64编码解码SHA256编码urlsafe_b64encode编码

使用带有 RS256 加密的 express-jwt 在应用程序路由上解码 JWT 令牌会引发未经授权的错误

在 PHP 中编码方法 RS256

节点 js JWT 令牌不是使用 RS256 算法生成的