Class: HasHelpers::ServiceTrust::JwtCodec

Inherits:
Object
  • Object
show all
Defined in:
lib/has_helpers/service_trust/jwt_codec.rb

Constant Summary collapse

ALLOWED_ALGORITHMS =
%w[RS256 EdDSA].freeze

Class Method Summary collapse

Class Method Details

.assert_allowed_algorithm!(alg) ⇒ Object



37
38
39
40
41
# File 'lib/has_helpers/service_trust/jwt_codec.rb', line 37

def assert_allowed_algorithm!(alg)
  return if ALLOWED_ALGORITHMS.include?(alg.to_s)

  raise InvalidSignatureError, "unsupported JWT algorithm"
end

.decode!(token, public_key, alg:) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/has_helpers/service_trust/jwt_codec.rb', line 21

def decode!(token, public_key, alg:)
  assert_allowed_algorithm!(alg)
  payload, = JWT.decode(
    token,
    public_key,
    true,
    algorithm: alg,
    leeway: HasHelpers::ServiceTrust.config.clock_skew.to_i
  )
  payload
rescue JWT::ExpiredSignature => e
  raise TokenExpiredError, e.message
rescue JWT::ImmatureSignature, JWT::DecodeError => e
  raise InvalidSignatureError, e.message
end

.encode(payload, private_key, kid, alg: "RS256") ⇒ Object



9
10
11
12
# File 'lib/has_helpers/service_trust/jwt_codec.rb', line 9

def encode(payload, private_key, kid, alg: "RS256")
  assert_allowed_algorithm!(alg)
  JWT.encode(payload, private_key, alg, kid: kid, typ: "JWT")
end

.peek(token) ⇒ Object



14
15
16
17
18
19
# File 'lib/has_helpers/service_trust/jwt_codec.rb', line 14

def peek(token)
  payload, header = JWT.decode(token, nil, false)
  [header, payload]
rescue JWT::DecodeError => e
  raise InvalidTokenError, e.message
end