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.digest 和 User.new_token,和修改過的 user.authenticated? 方法。
下表是這幾個功能的比較,之後我們會定義適用於表格中情況的通用版 authenticated? 方法:
login、remembering、account activation、password reset 比較表
| find by | string | digest | authentication |
|---|---|---|---|
| password | password_digest | authenticate(password) | |
| id | remember_token | remember_digest | authenticated?(:remember, token) |
| activation_token | activation_digest | authenticated?(:activation, token) | |
| reset_token | reset_digest | authenticated?(:reset, token) |
和之前一樣,先開個分支,之後會提到,帳號啟動和重設密碼需要共用一些 email 的設定,合併到 master 之前,要把這些設定應用在這兩個功能上,所以在一個分支中開發這兩個功能比較方便:
$ git checkout master
$ git checkout -b account-activation-password-reset