class Userlist::Token

Attributes

algorithm[R]
header[R]
key[R]
payload[R]

Public Class Methods

generate(user, configuration = {}) click to toggle source
# File lib/userlist/token.rb, line 3
def self.generate(user, configuration = {})
  config = Userlist.config.merge(configuration)

  raise Userlist::ConfigurationError, :push_key unless config.push_key
  raise Userlist::ConfigurationError, :push_id unless config.push_id
  raise Userlist::ArgumentError, 'Missing required user or identifier' unless user

  user = Userlist::Push::User.from_payload(user, config)

  now = Time.now.utc.to_i

  header = {
    kid: config.push_id,
    alg: 'HS256'
  }

  payload = {
    sub: user.identifier,
    exp: now + config.token_lifetime,
    iat: now
  }

  new(payload: payload, header: header, key: config.push_key).to_s
end
new(payload:, header:, key:, algorithm: 'HS256') click to toggle source
# File lib/userlist/token.rb, line 28
def initialize(payload:, header:, key:, algorithm: 'HS256')
  @payload = payload
  @header = header
  @algorithm = algorithm
  @key = key
end

Public Instance Methods

encoded_header() click to toggle source
# File lib/userlist/token.rb, line 35
def encoded_header
  encode(header)
end
encoded_header_and_payload() click to toggle source
# File lib/userlist/token.rb, line 43
def encoded_header_and_payload
  "#{encoded_header}.#{encoded_payload}"
end
encoded_payload() click to toggle source
# File lib/userlist/token.rb, line 39
def encoded_payload
  encode(payload)
end
signature() click to toggle source
# File lib/userlist/token.rb, line 47
def signature
  digest = OpenSSL::Digest.new(algorithm.sub('HS', 'SHA'))
  signature = OpenSSL::HMAC.digest(digest, key, encoded_header_and_payload)

  encode(signature)
end
to_s() click to toggle source
# File lib/userlist/token.rb, line 54
def to_s
  "#{encoded_header_and_payload}.#{signature}"
end

Private Instance Methods

encode(payload) click to toggle source
# File lib/userlist/token.rb, line 62
def encode(payload)
  payload = JSON.generate(payload) unless payload.is_a?(String)

  Base64.urlsafe_encode64(payload).tr('=', '')
end