前言
密碼重設是 Web 應用程式不可或缺的認證流程。使用起始套件(Starter Kit)時會自動建置此功能,但在僅提供 API 的專案或自製 UI 的專案中,需要手動實作。 需要手動實作的情境:- 專為 API 提供的後端(前端為 SPA、行動應用程式)
- 不使用起始套件而自行建置認證 UI 時
- 想完全自訂郵件通知或重設 URL 的設計時
若使用起始套件(
laravel new)建立專案,密碼重設功能已經實作完成。本頁面說明在沒有起始套件的情況下的實作方法。設定
密碼重設的設定由config/auth.php 的 passwords 鍵管理。
driver— 資料儲存方式(database或cache)expire— token 的有效期限(分鐘)。預設為 60 分鐘throttle— 限制重送前的等待時間(秒)
Driver
database driver
預設 driver。將密碼重設 token 存到資料庫的password_reset_tokens 資料表。此資料表包含在 Laravel 的預設 migration(0001_01_01_000000_create_users_table.php)中。
cache driver
cache driver 將 token 存到快取 store。因此不需要 password_reset_tokens 資料表的 migration。因 token 以使用者的電子郵件為 key 儲存,請注意不要在應用程式的其他地方以同樣的 email 作為快取 key。
store 指定專用快取 store 可以避免 php artisan cache:clear 時重設資料被清除。指定的值需對應到 config/cache.php 內設定的 store 名稱。
Model 的準備
要使用密碼重設功能,App\Models\User model 需要兩個 trait。
Notifiable— 寄送郵件通知時所需CanResetPassword— 提供產生/驗證密碼重設 token 所需的方法
Laravel 預設的
User model 已經包含這些 trait。全新安裝時無需再新增。實作路由
密碼重設需要 4 條路由。1. 重設連結的請求表單
顯示輸入電子郵件的表單。2. 寄送重設連結的處理
接收表單送出,使用Password::sendResetLink() 寄送重設郵件。
Password::sendResetLink() 會回傳狀態字串。
3. 密碼重設表單
顯示表單讓點擊郵件連結的使用者輸入新密碼。4. 密碼重設執行處理
接收表單,並以Password::reset() 更新密碼。
Password::reset() 的狀態常數:
Token 的有效期限
可透過config/auth.php 的 expire 選項以分鐘為單位設定 token 的有效期限。預設為 60 分鐘。
database driver,過期 token 會殘留在資料庫中。可用下列 Artisan 指令定期清除:
自訂
使用自訂通知
要自訂密碼重設郵件時,在User model 覆寫 sendPasswordResetNotification 方法。
自訂重設連結 URL
在AppServiceProvider 的 boot 方法中使用 ResetPassword::createUrlUsing(),可變更重設連結的 URL。適用於欲導向 SPA 等其他來源的前端時。
Trusted Hosts 設定
密碼重設連結是根據 HTTP 請求的Host header 產生。為避免來自非法 host 的請求,建議在 bootstrap/app.php 設定 Trusted Hosts。
總結
後續步驟
認證入門
了解 Laravel 認證系統整體的運作機制。
通知
詳細了解郵件通知的自訂方式。