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);
});
}
}
發佈留言