Module: TokenFor::ClassMethods
- Defined in:
- lib/token_for.rb
Instance Method Summary collapse
- #token_for(subject, attrs: [], expires_in: nil, one_time_use: true) ⇒ Object
-
#verifier_for(purpose) ⇒ Object
FIXME: This probably shouldn’t be public api.
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.("#{self.name}-#{p.to_s}") end end |