跳到內容 跳到搜尋
Method
G

實例公開的 method

generates_token_for(purpose, expires_in: nil, &block)

定義針對特定 目的所產生的 token 行為。token 可以透過在紀錄上呼叫 TokenFor#generate_token_for 來產生。稍後,可以在提供相同的目的和 token 的情況下,透過呼叫 find_by_token_for(或 find_by_token_for!)來擷取該紀錄。

token 經過簽署,所以防竄改。因此,它們可以公開於外部世界,例如密碼重設 token。

預設情況下,token 不會過期。它們可以透過 expires_in 選項指定持續時間予以設定為過期。持續時間會成為 token 簽署的一部分,所以變更 expires_in 的值會自動使之前產生的 token 無效。

也可以指定區塊。在使用 TokenFor#generate_token_for 產生 token 時,區塊會在紀錄的內容中評估,其回傳值會以 JSON 嵌入到 token 中。之後,在使用 find_by_token_for 擷取紀錄時,區塊會在已擷取紀錄的內容中再次評估。如果兩個 JSON 值不相符,則 token 會被視為無效。請注意,區塊傳回的值不應包含敏感資訊,因為它會以人類可讀的明文 JSON 的形式嵌入到 token 中

範例

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