跳至内容 跳至搜索
方法
G

实例公共方法

generates_token_for(purpose, expires_in: nil, &block)

定义特定purpose生成的令牌的行为。令牌可以通过在记录上调用TokenFor#generate_token_for来生成。之后,可以通过使用相同的purpose和token调用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