class Toktok::Token

Attributes

config[R]
jwt[R]
payload[R]

Public Class Methods

new(identity: nil, jwt: nil, payload: nil) click to toggle source
# File lib/toktok/token.rb, line 10
def initialize(identity: nil, jwt: nil, payload: nil)
  @config = Toktok.config
  @payload = {}
  if jwt
    initialize_decode(jwt, identity)
  else
    initialize_encode(identity, payload)
  end
end

Public Instance Methods

identity() click to toggle source
# File lib/toktok/token.rb, line 20
def identity
  payload[:sub]
end

Private Instance Methods

algorithm?() click to toggle source
# File lib/toktok/token.rb, line 50
def algorithm?
  config.algorithm != 'none'
end
decode_options(identity) click to toggle source
# File lib/toktok/token.rb, line 44
def decode_options(identity)
  options = { algorithm: config.algorithm }
  options = options.merge(sub: identity, verify_sub: true) if identity
  options
end
initialize_decode(jwt, identity) click to toggle source
# File lib/toktok/token.rb, line 32
def initialize_decode(jwt, identity)
  @jwt = jwt
  options = decode_options(identity)
  decoded_token = JWT.decode(jwt, config.secret_key, algorithm?, options)
  @payload = symbolize_keys(decoded_token[0])
  @header = decoded_token[1]
rescue JWT::InvalidSubError
  raise InvalidIdentity, "Invalid identity. Expected #{identity}"
rescue JWT::VerificationError
  raise InvalidSignature, 'Invalid or manipulated signature'
end
initialize_encode(identity, extra) click to toggle source
# File lib/toktok/token.rb, line 26
def initialize_encode(identity, extra)
  prepare_payload(identity, extra)
  normalize_payload
  @jwt = JWT.encode(payload, config.secret_key, config.algorithm)
end
normalize_payload() click to toggle source

Guarantee the order in which the keys are inserted

# File lib/toktok/token.rb, line 61
def normalize_payload
  @payload = Hash[payload.keys.sort.map { |k| [k, payload[k]] }]
end
prepare_payload(identity, extra = nil) click to toggle source
# File lib/toktok/token.rb, line 54
def prepare_payload(identity, extra = nil)
  @payload.merge!(symbolize_keys(extra)) if extra
  @payload[:sub] = identity
  @payload[:exp] = Time.now.to_i + config.lifetime if config.lifetime.to_i > 0
end
symbolize_keys(hash) click to toggle source
# File lib/toktok/token.rb, line 65
def symbolize_keys(hash)
  Hash[hash.map { |k, v| [k.to_sym, v] }]
end