Spec-Zone.ru › Ruby on Rails 8.1

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