Module: Devise::JwtHelper

Defined in:
lib/devise_jwt_helper.rb

Constant Summary collapse

JWT_ALGORITHM =
'HS256'

Class Method Summary collapse

Class Method Details

.decode(token, secret) ⇒ Object

Raises:

  • (ArgumentError)


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

Returns:

  • (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