跳至内容 跳至搜索
方法
G

实例公共方法

generates_token_for(purpose, expires_in: nil, &block)

定义为特定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
# 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