Spec-Zone.ru › Ruby on Rails 7.2

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

Общедоступные методы экземпляров

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

Spec-Zone.ru

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