модуль 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.