Module: TokenFor::ClassMethods

Defined in:
lib/token_for.rb

Instance Method Summary collapse

Instance Method Details

#token_for(subject, attrs: [], expires_in: nil, one_time_use: true) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/token_for.rb', line 8

def token_for subject, attrs: [], expires_in: nil, one_time_use: true

  # A method for generating the token
  define_method("#{subject}_token") do
    verifier = self.class.verifier_for(subject)
    attr_hash = {} # The attributes need to be in a hash
    attrs.map { |a| attr_hash.merge! a.to_sym => self.read_attribute(a) }
    attr_hash.merge!(updated_at: self.updated_at) if one_time_use
    attr_hash.merge!(expires_on: Time.zone.now + expires_in) if expires_in
    # Generate based on actual values of attributes.
    verifier.generate(attr_hash)
  end

  # Finds the record based on token. Raises TokenExpired if needed
  define_singleton_method("find_by_#{subject}_token!") do |token|
    attributes = self.verifier_for(subject).verify(token)
    raise TokenExpired if attributes[:expires_on] && attributes[:expires_on] < Time.zone.now
    self.find_by(attributes.except(:expires_on))
  end
end

#verifier_for(purpose) ⇒ Object

FIXME: This probably shouldn’t be public api



30
31
32
33
34
35
# File 'lib/token_for.rb', line 30

def verifier_for(purpose)
  @verifiers ||= {}
  @verifiers.fetch(purpose) do |p|
    @verifiers[p] = Rails.application.message_verifier("#{self.name}-#{p.to_s}")
  end
end