Spec-Zone.ru › Ruby on Rails 7.1

модуль ActiveRecord::TokenFor::ClassMethods

Публичные методы экземпляров

find_by_token_for(purpose, token) Показать исходный код
# 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 , если токен недействителен или запись не найдена.

find_by_token_for!(purpose, token) Показать исходный код
# 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, если токен действителен, но запись не найдена.

generates_token_for(purpose, expires_in: nil, &block) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API