Skip to main content

前言

密碼重設是 Web 應用程式不可或缺的認證流程。使用起始套件(Starter Kit)時會自動建置此功能,但在僅提供 API 的專案或自製 UI 的專案中,需要手動實作。 需要手動實作的情境:
  • 專為 API 提供的後端(前端為 SPA、行動應用程式)
  • 不使用起始套件而自行建置認證 UI 時
  • 想完全自訂郵件通知或重設 URL 的設計時
若使用起始套件(laravel new)建立專案,密碼重設功能已經實作完成。本頁面說明在沒有起始套件的情況下的實作方法。
密碼重設的整體流程如下:

設定

密碼重設的設定由 config/auth.phppasswords 鍵管理。
  • driver — 資料儲存方式(databasecache
  • expire — token 的有效期限(分鐘)。預設為 60 分鐘
  • throttle — 限制重送前的等待時間(秒)

Driver

database driver

預設 driver。將密碼重設 token 存到資料庫的 password_reset_tokens 資料表。此資料表包含在 Laravel 的預設 migration(0001_01_01_000000_create_users_table.php)中。

cache driver

這是 Laravel 11 起可用的新選項。由於不需要資料表,可以用更簡潔的設定實作密碼重設。
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. 重設連結的請求表單

顯示輸入電子郵件的表單。
對應的 Blade view:

2. 寄送重設連結的處理

接收表單送出,使用 Password::sendResetLink() 寄送重設郵件。
Password::sendResetLink() 會回傳狀態字串。

3. 密碼重設表單

顯示表單讓點擊郵件連結的使用者輸入新密碼。
對應的 Blade view:

4. 密碼重設執行處理

接收表單,並以 Password::reset() 更新密碼。
Password::reset() 的狀態常數:

Token 的有效期限

可透過 config/auth.phpexpire 選項以分鐘為單位設定 token 的有效期限。預設為 60 分鐘。
若使用 database driver,過期 token 會殘留在資料庫中。可用下列 Artisan 指令定期清除:
建議透過排程器自動化:

自訂

使用自訂通知

要自訂密碼重設郵件時,在 User model 覆寫 sendPasswordResetNotification 方法。

自訂重設連結 URL

AppServiceProviderboot 方法中使用 ResetPassword::createUrlUsing(),可變更重設連結的 URL。適用於欲導向 SPA 等其他來源的前端時。

Trusted Hosts 設定

密碼重設連結是根據 HTTP 請求的 Host header 產生。為避免來自非法 host 的請求,建議在 bootstrap/app.php 設定 Trusted Hosts。
在實作密碼重設功能時,請務必確認 Trusted Hosts 的設定。設定不完備會有 host header injection 攻擊的風險。

總結

後續步驟

認證入門

了解 Laravel 認證系統整體的運作機制。

通知

詳細了解郵件通知的自訂方式。
最後修改於 2026年8月2日