Account activation

目前,只要使用者經過註冊就能立即控制自己的帳號。這節,我們要實作帳號啟動的步驟,檢查使用者擁有註冊時使用的 email。這個步驟包含使用者的 activation token 和 activation digest,然後寄信給使用者,信裡會有包含 token 的連結,最後使用者點擊連結,就會啟動帳號。

我們要實作的步驟和登入使用者、記住使用者差不多:

  • 讓使用者一開始處於「未啟動」(unactivated)狀態
  • 當使用者一註冊,就會產生一個 activation token 和相對應的 activation digest
  • 把 activation digest 存進資料庫,然後發一封 email 給使用者,裡面包含 activation token 的連結以及使用者的 email(使用 ID 也可以,但因為 ID 已經暴露在 URL 中,使用 email 會更有彈性,搞不好以後你想隱藏 ID,不讓對手知道你有多少使用者)
  • 當使用者點擊連結,透過 email 尋找該名使用者,然後驗證 activation token 和 activation digest 是否匹配
  • 如果使用者通過驗證,就把狀態從「未啟動」改成「已啟動」

因為有很多地方都跟密碼和 remember token 類似,實作帳號啟動時(以及重設密碼),我們可以重複使用一些之前定義過的方法,像是 User.digestUser.new_token,和修改過的 user.authenticated? 方法。

下表是這幾個功能的比較,之後我們會定義適用於表格中情況的通用版 authenticated? 方法:

login、remembering、account activation、password reset 比較表

find by string digest authentication
email password password_digest authenticate(password)
id remember_token remember_digest authenticated?(:remember, token)
email activation_token activation_digest authenticated?(:activation, token)
email reset_token reset_digest authenticated?(:reset, token)

和之前一樣,先開個分支,之後會提到,帳號啟動和重設密碼需要共用一些 email 的設定,合併到 master 之前,要把這些設定應用在這兩個功能上,所以在一個分支中開發這兩個功能比較方便:

$ git checkout master
$ git checkout -b account-activation-password-reset