Email Verification
Table of Contents
Introduction
多くの web アプリケーションでは、 application を使用する前に users が自分の email アドレスを確認する必要があります。手作業でこの feature を各 application で再実装するのではなく、 Laravel は便利な組み込みの services を提供して、 email verification のリクエストを送信し、確認することができます。
NOTE
すぐに始めたいですか?新規の Laravel application にLaravel application のスターターキットをインストールしてみてください。スターターキットにより、 email verification サポートを含む全体的な authentication システムの足場が整います。
Model の準備
始める前に、あなたのApp\Models\User
model が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;
// ...
}
このインターフェースがあなたの model に追加されると、新しく登録された users には自動的に email verification リンクが含まれた email が送信されます。これは、 Laravel が自動的にIlluminate\Auth\Listeners\SendEmailVerificationNotification
listenerをIlluminate\Auth\Events\Registered
event に登録するため、シームレスに行われます。
starter kitを利用せずに、application 内で登録を手動で実装している場合、user の登録が成功した後にIlluminate\Auth\Events\Registered
event を dispatch していることを確認する必要があります:
use Illuminate\Auth\Events\Registered;
event(new Registered($user));
Database Preparation
次に、あなたのusers
テーブルには、ユーザーの email アドレスが確認された日時を保存するためのemail_verified_at
column が含まれていなければなりません。通常、これは Laravel の default 0001_01_01_000000_create_users_table.php
database マイグレーションに含まれています。
Routing
email verification を適切に実装するためには、3 つの routes を定義する必要があります。まず、user に email verification の link をクリックするように通知するための route が必要です。この link は、Laravel が登録後に user に送った確認用の email の中にあります。
二つ目、 user が email の中の email verification リンクをクリックすると発生するリクエストを handle するための route が必要になります。
三つ目に、もし user が最初の確認リンクを誤って失った場合、確認リンクを再送するための route が必要となります。
Email Verification 通知
前述の通り、登録後に Laravel から送信された email verification のリンクを user にクリックさせるように指示する view を返す route を定義する必要があります。この view は、 users が他の application の部分にアクセスしようとしたときに、まず email アドレスを確認せずに表示されます。リンクは自動的に user にメールで送信されます、あなたの App\Models\User
model が MustVerifyEmail
インターフェースを実装している限り。
Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');
email verification の通知を返す route は、verification.notice
と名付けるべきです。 route にこの正確な名前が割り当てられていることが重要です。なぜなら、verified
middleware が“ Laravel 付属で、 user が email アドレスを確認していない場合、自動的にこの route 名に redirect するからです。
NOTE
email verification を手動で実装する際には、 view の検証通知の内容をご自身で required 定義する必要があります。全ての必要な authentication 和検証 views を含む足場が欲しい場合は、Laravel application スターターキットをご覧ください。
Email Verification Handler
次に、 user がメールで送られた email verification のリンクをクリックしたときに生成されるリクエストを handle する route を定義する必要があります。 この route はverification.verify
と名付けられ、auth
とsigned
のミドルウェアに割り当てられるべきです:
use Illuminate\Foundation\Auth\EmailVerificationRequest;
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
$request->fulfill();
return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');
次へ進む前に、この route をよく見てみましょう。まず、通常のIlluminate\Http\Request
インスタンスではなく、EmailVerificationRequest
という request type を使用していることに気付くでしょう。EmailVerificationRequest
は、 Laravel とともに提供されるform requestです。この request は、リクエストのid
とhash
パラメータの validating を自動的に行います。
次に、fulfill
という method を直接 request に呼び出すことができます。この method は、authentication された user のmarkEmailAsVerified
という method を呼び出し、Illuminate\Auth\Events\Verified
という event を dispatch します。 markEmailAsVerified
の method は、 default のApp\Models\User
という model にIlluminate\Foundation\Auth\User
の基本 class を介して利用できます。ユーザーの email が確認されると、あなたは彼らを希望する場所に redirect することができます。
認証 Email の再送信
時折、 user が誤って email アドレスの確認の email を紛失したり delete したりすることがあります。このような事態に対応するため、 user が確認の email を再送信するように request できる route を定義することができます。その後、確認通知の view にシンプルな形式の送信 button を設置することで、この route への request を行うことができます。
use Illuminate\Http\Request;
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 にアクセスできるのは確認済みの users のみに制限するために使用できます。Laravel には、verified
ミドルウェア alias が含まれており、これは Illuminate\Auth\Middleware\EnsureEmailIsVerified
ミドルウェア class の alias です。この alias はすでに Laravel によって自動的に登録されているため、必要なことは verified
middleware を route 定義に attach することだけです。通常、この middleware は auth
middleware とペアになっています。
Route::get('/profile', function () {
// Only verified users may access this route...
})->middleware(['auth', 'verified']);
未認証の user がこの middleware に割り当てられた route にアクセスを試みた場合、自動的に verification.notice
名前付き route にリダイレクトされます。
Customization
Email カスタマイズの確認
default の mail 確認通知は、ほとんどの application の要件を満たすはずですが、Laravel では mail 確認 mail メッセージがどのように構築されるかをカスタマイズすることができます。
始めるためには、Illuminate\Auth\Notifications\VerifyEmail
通知が提供するtoMailUsing
method にクロージャを渡します。クロージャは、通知を受け取っている model インスタンスと、user が mail アドレスの確認をするために訪れる必要がある署名付き mail 確認 URL を受け取ります。クロージャは Illuminate\Notifications\Messages\MailMessage
のインスタンスを返すべきです。通常、application の AppServiceProvider
class の boot
method から toMailUsing
method を呼び出すべきです。
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
/**
* Bootstrap any application 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);
});
}
NOTE
mail notifications について詳しく学びたい場合は、mail notification ドキュメンテーションをご参照ください。
Events
Laravel application スターターキットを使用するとき、Laravel は、 Illuminate\Auth\Events\Verified
eventsを email verification process 中に発行します。自分の application の mailauthentication を手動で行っている場合、authentication が完了した後にこれらの イベント を手動で dispatch することを検討するかもしれません。