class UserSession < ApplicationRecord TOKEN_LENGTH = 32 belongs_to :user validates :token_digest, presence: true, uniqueness: true def self.create_for!(user) raw_token = generate_raw_token user_session = create!(user: user, token_digest: digest(raw_token), last_used_at: Time.current) [ user_session, raw_token ] end def self.find_by_token(raw_token) return if raw_token.blank? find_by(token_digest: digest(raw_token)) end def self.generate_raw_token SecureRandom.urlsafe_base64(TOKEN_LENGTH) end def self.digest(raw_token) Digest::SHA256.hexdigest(raw_token.to_s) end end