跳到內容

電子郵件驗證

簡介

許多網路應用程式要求使用者先驗證他們的電子郵件地址,才能使用該應用程式。Laravel 並沒有強迫您為您建立的每個應用程式手動重新實作此功能,而是提供了方便的內建服務,用於發送和驗證電子郵件驗證請求。

想要快速開始嗎?在全新的 Laravel 應用程式中安裝Laravel 應用程式入門套件之一。入門套件將負責搭建您的整個身份驗證系統,包括電子郵件驗證支援。

模型準備

在開始之前,請確認您的 App\Models\User 模型實作了 Illuminate\Contracts\Auth\MustVerifyEmail 合約

1<?php
2 
3namespace App\Models;
4 
5use Illuminate\Contracts\Auth\MustVerifyEmail;
6use Illuminate\Foundation\Auth\User as Authenticatable;
7use Illuminate\Notifications\Notifiable;
8 
9class User extends Authenticatable implements MustVerifyEmail
10{
11 use Notifiable;
12 
13 // ...
14}

一旦將此介面添加到您的模型,新註冊的使用者將自動收到一封包含電子郵件驗證連結的電子郵件。之所以會無縫發生,是因為 Laravel 自動為 Illuminate\Auth\Events\Registered 事件註冊了 Illuminate\Auth\Listeners\SendEmailVerificationNotification 監聽器

如果您是在應用程式中手動實作註冊,而不是使用入門套件,則應確保在使用者註冊成功後發送 Illuminate\Auth\Events\Registered 事件

1use Illuminate\Auth\Events\Registered;
2 
3event(new Registered($user));

資料庫準備

接下來,您的 users 資料表必須包含 email_verified_at 欄位,以儲存使用者電子郵件地址驗證的日期和時間。通常,這包含在 Laravel 預設的 0001_01_01_000000_create_users_table.php 資料庫遷移中。

路由

為了正確實作電子郵件驗證,需要定義三個路由。首先,需要一個路由來向使用者顯示通知,告知他們應該點擊 Laravel 在註冊後發送給他們的驗證電子郵件中的電子郵件驗證連結。

其次,需要一個路由來處理使用者點擊電子郵件中的電子郵件驗證連結時產生的請求。

第三,如果使用者不小心遺失了第一個驗證連結,則需要一個路由來重新發送驗證連結。

電子郵件驗證通知

如前所述,應該定義一個路由,該路由將返回一個視圖,指示使用者點擊 Laravel 在註冊後通過電子郵件發送給他們的電子郵件驗證連結。當使用者嘗試訪問應用程式的其他部分但尚未驗證其電子郵件地址時,將向使用者顯示此視圖。請記住,只要您的 App\Models\User 模型實作了 MustVerifyEmail 介面,連結就會自動通過電子郵件發送給使用者

1Route::get('/email/verify', function () {
2 return view('auth.verify-email');
3})->middleware('auth')->name('verification.notice');

返回電子郵件驗證通知的路由應命名為 verification.notice。重要的是,該路由被分配了這個確切的名稱,因為 Laravel 包含的 verified 中介層 將在使用者未驗證其電子郵件地址時自動重新導向到此路由名稱。

當手動實作電子郵件驗證時,您需要自行定義驗證通知視圖的內容。如果您想要包含所有必要的身份驗證和驗證視圖的支架,請查看Laravel 應用程式入門套件

電子郵件驗證處理器

接下來,我們需要定義一個路由,該路由將處理使用者點擊通過電子郵件發送給他們的電子郵件驗證連結時產生的請求。此路由應命名為 verification.verify,並分配 authsigned 中介層

1use Illuminate\Foundation\Auth\EmailVerificationRequest;
2 
3Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
4 $request->fulfill();
5 
6 return redirect('/home');
7})->middleware(['auth', 'signed'])->name('verification.verify');

在繼續之前,讓我們仔細看看這個路由。首先,您會注意到我們正在使用 EmailVerificationRequest 請求類型,而不是典型的 Illuminate\Http\Request 實例。 EmailVerificationRequest 是一個 表單請求,它包含在 Laravel 中。此請求將自動處理驗證請求的 idhash 參數。

接下來,我們可以繼續直接呼叫請求上的 fulfill 方法。此方法將呼叫已驗證使用者的 markEmailAsVerified 方法,並發送 Illuminate\Auth\Events\Verified 事件。 markEmailAsVerified 方法可通過 Illuminate\Foundation\Auth\User 基類用於預設的 App\Models\User 模型。一旦使用者的電子郵件地址已驗證,您可以將他們重新導向到您希望的任何位置。

重新發送驗證電子郵件

有時,使用者可能會放錯位置或意外刪除電子郵件地址驗證電子郵件。為了適應這種情況,您可能希望定義一個路由,以允許使用者請求重新發送驗證電子郵件。然後,您可以通過在您的驗證通知視圖中放置一個簡單的表單提交按鈕來向此路由發出請求

1use Illuminate\Http\Request;
2 
3Route::post('/email/verification-notification', function (Request $request) {
4 $request->user()->sendEmailVerificationNotification();
5 
6 return back()->with('message', 'Verification link sent!');
7})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

保護路由

路由中介層可以用於僅允許已驗證的使用者訪問給定的路由。Laravel 包含一個 verified 中介層別名,它是 Illuminate\Auth\Middleware\EnsureEmailIsVerified 中介層類別的別名。由於此別名已由 Laravel 自動註冊,您只需將 verified 中介層附加到路由定義即可。通常,此中介層與 auth 中介層配對使用

1Route::get('/profile', function () {
2 // Only verified users may access this route...
3})->middleware(['auth', 'verified']);

如果未驗證的使用者嘗試訪問已分配此中介層的路由,他們將自動重新導向到 verification.notice 命名路由

自訂

驗證電子郵件自訂

儘管預設的電子郵件驗證通知應滿足大多數應用程式的需求,但 Laravel 允許您自訂電子郵件驗證郵件訊息的建構方式。

要開始使用,請將閉包傳遞給 Illuminate\Auth\Notifications\VerifyEmail 通知提供的 toMailUsing 方法。閉包將接收接收通知的可通知模型實例,以及使用者必須訪問以驗證其電子郵件地址的簽名電子郵件驗證 URL。閉包應返回 Illuminate\Notifications\Messages\MailMessage 的實例。通常,您應該從應用程式 AppServiceProvider 類別的 boot 方法呼叫 toMailUsing 方法

1use Illuminate\Auth\Notifications\VerifyEmail;
2use Illuminate\Notifications\Messages\MailMessage;
3 
4/**
5 * Bootstrap any application services.
6 */
7public function boot(): void
8{
9 // ...
10 
11 VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
12 return (new MailMessage)
13 ->subject('Verify Email Address')
14 ->line('Click the button below to verify your email address.')
15 ->action('Verify Email Address', $url);
16 });
17}

要了解有關郵件通知的更多資訊,請查閱郵件通知文件

事件

當使用Laravel 應用程式入門套件時,Laravel 在電子郵件驗證過程中會發送 Illuminate\Auth\Events\Verified 事件。如果您正在為您的應用程式手動處理電子郵件驗證,您可能希望在驗證完成後手動發送這些事件。