Module: Devise::JwtHelper
- Defined in:
- lib/devise_jwt_helper.rb
Constant Summary collapse
- JWT_ALGORITHM =
'HS256'
Class Method Summary collapse
- .decode(token, secret) ⇒ Object
- .encode(payload, secret, exp_hours: 24) ⇒ Object
- .refresh(token, secret, **opts) ⇒ Object
- .valid?(token, secret) ⇒ Boolean
Class Method Details
.decode(token, secret) ⇒ Object
18 19 20 21 22 23 24 25 26 27 |
# File 'lib/devise_jwt_helper.rb', line 18 def self.decode(token, secret) require 'openssl' require 'base64' parts = token.split('.') raise ArgumentError, 'Invalid token format' unless parts.length == 3 header, body, sig = parts expected = Base64.urlsafe_encode64(OpenSSL::HMAC.digest('SHA256', secret, "#{header}.#{body}"), padding: false) raise SecurityError, 'Invalid signature' unless sig == expected JSON.parse(Base64.urlsafe_decode64(body)) end |
.encode(payload, secret, exp_hours: 24) ⇒ Object
8 9 10 11 12 13 14 15 16 |
# File 'lib/devise_jwt_helper.rb', line 8 def self.encode(payload, secret, exp_hours: 24) require 'openssl' require 'base64' header = Base64.urlsafe_encode64('{"alg":"HS256","typ":"JWT"}', padding: false) body = Base64.urlsafe_encode64(payload.merge(exp: Time.now.to_i + exp_hours * 3600).to_json, padding: false) sig_input = "#{header}.#{body}" sig = Base64.urlsafe_encode64(OpenSSL::HMAC.digest('SHA256', secret, sig_input), padding: false) "#{sig_input}.#{sig}" end |
.refresh(token, secret, **opts) ⇒ Object
29 30 31 32 33 |
# File 'lib/devise_jwt_helper.rb', line 29 def self.refresh(token, secret, **opts) payload = decode(token, secret) payload.delete('exp') encode(payload.transform_keys(&:to_sym), secret, **opts) end |
.valid?(token, secret) ⇒ Boolean
35 36 37 38 39 40 |
# File 'lib/devise_jwt_helper.rb', line 35 def self.valid?(token, secret) payload = decode(token, secret) payload['exp'].nil? || payload['exp'] > Time.now.to_i rescue false end |