方法
实例公共方法
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
来源:显示 | 在 GitHub 上
# 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