Laravel 10 信箱認證(Email Verification)

Laravel 利用預設的函數建立信箱認證系統

laravel-10-快速建立認證系統 建立好 Lavavel 基本的認證系統,接下來為了讓使用者在註冊時留下的信箱是有效的,我們可以發出認證信件到用戶的信箱,讓他去確認。要作的步驟如下:

Step01: 設定郵件主機

# .env 檔案

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=您的信箱
MAIL_PASSWORD=信箱密碼
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="顯示來自那個信箱位址"
MAIL_FROM_NAME="${APP_NAME}"

Step02: 修改 Model: App\Models\User

加入實作  Illuminate\Contracts\Auth\MustVerifyEmail

<?php
 
namespace App\Models;
 
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
 
class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;
 
    // ...
}

這樣在註冊後,系統會自動發出認證信件

Step03: 建立路由 (Routing)

在 routes\web.php 檔案裡加入下列的路由

<?php

use Illuminate\Support\Facades\Route;

use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\Request;

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

// 顯示驗證信箱的頁面 The Email Verification Notice
Route::get('/email/verify', function () {
    return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');

// 由用戶信箱連回的驗證 The Email Verification Handler 
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
    $request->fulfill();
 
    return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');

// 重送驗證信箱連結信件 Resending The Verification Email
// 其中 throttle代表的是訪問頻率限制,throttle:6,1 一分鐘內被訪問最高次數為6次
Route::post('/email/verification-notification', function (Request $request) {
    $request->user()->sendEmailVerificationNotification();
 
    return back()->with('message', 'Verification link sent!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

// 信箱有被驗證方可進入 Protecting Routes
Route::get('/profile', function () {
    // Only verified users may access this route...
    return "MyProfile";
})->middleware(['auth', 'verified']);

middleware 是指 qpp\Http\kernel.php 裡的攔截點

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{    /**
     * The application's middleware aliases.
     *
     * Aliases may be used instead of class names to conveniently assign middleware to routes and groups.
     *
     * @var array<string, class-string|string>
     */
    protected $middlewareAliases = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
        'signed' => \App\Http\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];
}

Step04: 客製認證信件

<?php

namespace App\Providers;

// use Illuminate\Support\Facades\Gate;
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Notifications\Messages\MailMessage;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any authentication / authorization services.
     */
    public function boot(): void
    {
        //
        VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
            return (new MailMessage)
                ->subject('Verify Email Address')
                ->line('Click the button below to verify your email address.')
                ->action('Verify Email Address', $url);
        });
    }
}

參考: https://laravel.com/docs/10.x/verification#introduction

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *