модуль ActiveRecord::TokenFor::ClassMethods
Открытые методы экземпляра
# File activerecord/lib/active_record/token_for.rb, line 102 def generates_token_for(purpose, expires_in: nil, &block) self.token_definitions = token_definitions.merge(purpose => TokenDefinition.new(self, purpose, expires_in, block)) end
Определяет поведение токенов, создаваемых для конкретного purpose. Токен можно создать, вызвав TokenFor#generate_token_for для записи. Позже эту запись можно найти, вызвав find_by_token_for (или find_by_token_for!) с теми же назначением и токеном.
Токены подписываются, чтобы защитить их от подделки. Поэтому их можно предоставлять внешним пользователям, например, в качестве токенов для сброса пароля.
По умолчанию срок действия токенов не истекает. Чтобы настроить срок действия, укажите длительность с помощью параметра expires_in. Длительность становится частью подписи токена, поэтому изменение значения expires_in автоматически сделает ранее созданные токены недействительными.
Также можно указать блок. При создании токена с помощью TokenFor#generate_token_for блок будет выполнен в контексте записи, а его возвращаемое значение будет встроено в токен в формате JSON. Позже, при поиске записи с помощью find_by_token_for, блок будет выполнен снова в контексте найденной записи. Если значения JSON не совпадут, токен будет считаться недействительным. Обратите внимание: значение, возвращаемое блоком, не должно содержать конфиденциальную информацию, поскольку оно будет встроено в токен в виде человекочитаемого JSON в открытом текстовом виде.
Примеры
class User < ActiveRecord::Base
has_secure_password
generates_token_for :password_reset, expires_in: 15.minutes do
# Last 10 characters of password salt, which changes when password is updated:
password_salt&.last(10)
end
end
user = User.first
token = user.generate_token_for(:password_reset)
User.find_by_token_for(:password_reset, token) # => user
# 16 minutes later...
User.find_by_token_for(:password_reset, token) # => nil
token = user.generate_token_for(:password_reset)
User.find_by_token_for(:password_reset, token) # => user
user.update!(password: "new password")
User.find_by_token_for(:password_reset, token) # => nil
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.