class Negroni::TokenGenerator

Generates a secure token.

Public Class Methods

new(key_generator = nil, digest = 'SHA256', secret_key: nil) click to toggle source

Creates a new token generator.

@param key_generator [ActiveSupport::CachingKeyGenerator] the generator @param digest [String, Symbol] The digest to use. Must be a stringified version of an OpenSSL::Digest subclass. Default: `SHA256`.

# File lib/negroni/token_generator.rb, line 13
def initialize(key_generator = nil, digest = 'SHA256', secret_key: nil)
  @key_generator = if secret_key
                     ActiveSupport::CachingKeyGenerator.new(
                       ActiveSupport::KeyGenerator.new(secret_key)
                     )
                   elsif key_generator
                     key_generator
                   else
                     raise ArgumentError, 'Unexpected arguments!'
                   end
  @digest = digest
end

Public Instance Methods

digest(_klass, column, value) click to toggle source

Digest a key.

@param _klass [Class] the class for which to digest the value. @param column [String] the column name to digest. @param value [#to_s] the value to digest.

@return [String] the digested value.

# File lib/negroni/token_generator.rb, line 33
def digest(_klass, column, value)
  return unless value.present?
  OpenSSL::HMAC.hexdigest(@digest, key_for(column), value.to_s)
end
generate(klass, column) click to toggle source

Generate a key.

@param klass [Class] the class for which to generate the key. @param column [String] the column name to generate a key for.

# File lib/negroni/token_generator.rb, line 42
def generate(klass, column)
  key = key_for(column)

  loop do
    raw = Negroni.friendly_token
    enc = OpenSSL::HMAC.hexdigest(@digest, key, raw)
    break [raw, enc] unless klass.to_adapter.find_first(column => enc)
  end
end

Private Instance Methods

key_for(column) click to toggle source
# File lib/negroni/token_generator.rb, line 54
def key_for(column)
  @key_generator.generate_key "Negroni #{column}"
end