модуль ActiveRecord::TokenFor::ClassMethods
Публичные методы экземпляров
# File activerecord/lib/active_record/token_for.rb, line 90
def find_by_token_for(purpose, token)
raise UnknownPrimaryKey.new(self) unless primary_key
token_definitions.fetch(purpose).resolve_token(token) { |id| find_by(primary_key => id) }
end Находит запись, используя заданный token для предопределённого purpose. Возвращает nil , если токен недействителен или запись не найдена.
# File activerecord/lib/active_record/token_for.rb, line 99
def find_by_token_for!(purpose, token)
token_definitions.fetch(purpose).resolve_token(token) { |id| find(id) } ||
(raise ActiveSupport::MessageVerifier::InvalidSignature)
end Находит запись, используя заданный token для предопределённого purpose. Вызывает исключение ActiveSupport::MessageVerifier::InvalidSignature, если токен недействителен (например, истек срок действия, неправильный формат и т. д.). Вызывает исключение ActiveRecord::RecordNotFound, если токен действителен, но запись не найдена.
# File activerecord/lib/active_record/token_for.rb, line 84 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.