Class: SecureWebToken

Inherits:
Object
  • Object
show all
Defined in:
lib/secure_web_token.rb,
lib/secure_web_token/version.rb

Constant Summary collapse

CHARACTERS =
[
  *('a'..'z'),
  *('A'..'Z'),
  *(0..9).map(&:to_s),
  *'!@#$%^&*()'.split('')
].freeze
DEFAULT_OPTIONS =
{ enc:  'A256GCM', alg: 'dir', zip: 'DEF' }.freeze
VERSION =
'0.2.1'

Class Method Summary collapse

Class Method Details

.decode(payload, sig_key = nil, enc_key = nil) ⇒ Object Also known as: read, decrypt, deflate



18
19
20
21
22
23
24
# File 'lib/secure_web_token.rb', line 18

def decode(payload, sig_key = nil, enc_key = nil)
  sig_key ||= signing_key
  enc_key ||= encryption_key
  decrypted = ::JWE.decrypt(payload, enc_key)

  ::JWT.decode(decrypted, sig_key, true, algorithm: 'HS512')[0]
end

.default_encryption_keyObject



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/secure_web_token.rb', line 29

def default_encryption_key
  if defined?(@default_enc_key) && is_present?(@default_enc_key)
    if @default_enc_key.respond_to? :call then
      get_presence(@default_enc_key.call) || gen_encryption_key
    else
      @default_enc_key
    end
  else
    gen_encryption_key
  end
end

.default_encryption_key=(value_or_callable) ⇒ Object



41
42
43
# File 'lib/secure_web_token.rb', line 41

def default_encryption_key=(value_or_callable)
  @default_enc_key = value_or_callable
end

.default_signing_keyObject



45
46
47
48
49
50
51
52
53
54
55
# File 'lib/secure_web_token.rb', line 45

def default_signing_key
  if defined?(@default_sig_key) && is_present?(@default_sig_key)
    if @default_sig_key.respond_to? :call then
      get_presence(@default_sig_key.call) || gen_signing_key
    else
      @default_sig_key
    end
  else
    gen_signing_key
  end
end

.default_signing_key=(value_or_callable) ⇒ Object



57
58
59
# File 'lib/secure_web_token.rb', line 57

def default_signing_key=(value_or_callable)
  @default_sig_key = value_or_callable
end

.encode(payload, sig_key = nil, enc_key = nil, options = nil) ⇒ Object Also known as: create, encrypt, inflate



61
62
63
64
65
66
67
68
# File 'lib/secure_web_token.rb', line 61

def encode(payload, sig_key = nil, enc_key = nil, options = nil)
  sig_key ||= signing_key
  enc_key ||= encryption_key
  options ||= encrypt_options
  encoded = ::JWT.encode(payload, sig_key, 'HS512')

  ::JWE.encrypt(encoded, enc_key, **options)
end

.encrypt_optionsObject



73
74
75
# File 'lib/secure_web_token.rb', line 73

def encrypt_options
  @encrypt_options ||= DEFAULT_OPTIONS
end

.encrypt_options=(options) ⇒ Object



77
78
79
# File 'lib/secure_web_token.rb', line 77

def encrypt_options=(options)
  @encrypt_options = (options || DEFAULT_OPTIONS)
end

.encryption_keyObject



81
82
83
# File 'lib/secure_web_token.rb', line 81

def encryption_key
  @encryption_key ||= default_encryption_key
end

.encryption_key=(key) ⇒ Object



85
86
87
# File 'lib/secure_web_token.rb', line 85

def encryption_key=(key)
  @encryption_key = (key || gen_encryption_key)
end

.gen_encryption_keyObject



89
90
91
# File 'lib/secure_web_token.rb', line 89

def gen_encryption_key
  SecureRandom.random_bytes(32)
end

.gen_signing_key(length = 50) ⇒ Object



93
94
95
# File 'lib/secure_web_token.rb', line 93

def gen_signing_key(length = 50)
  (0...length).map { CHARACTERS[rand(CHARACTERS.length)] }.join
end

.signing_keyObject



97
98
99
# File 'lib/secure_web_token.rb', line 97

def signing_key
  @signing_key ||= default_signing_key
end

.signing_key=(key) ⇒ Object



101
102
103
# File 'lib/secure_web_token.rb', line 101

def signing_key=(key)
  @signing_key = (key || gen_signing_key)
end