メール認証
イントロダクション
多くのWebアプリケーションでは、ユーザーがアプリケーションを使用する前にメールアドレスを認証する必要があります。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 MustVerifyEmail10{11 use Notifiable;12 13 // ...14}
このインターフェイスをモデルに追加すると、新しく登録されたユーザーには、メール認証リンクを含むメールが自動的に送信されます。Laravelが自動的にIlluminate\Auth\Listeners\SendEmailVerificationNotificationリスナをIlluminate\Auth\Events\Registeredイベントに登録するため、これはシームレスに行われます。
スターターキットを使用する代わりにアプリケーション内で登録を手動で実装している場合は、ユーザーの登録が成功した後に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データベースマイグレーションに含まれています。
ルーティング
メール認証を適切に実装するには、3つのルートを定義する必要があります。まず、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という名前を付け、authとsignedミドルウェアを割り当てる必要があります。
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');
先に進む前に、このルートを詳しく見てみましょう。まず、典型的なIlluminate\Http\Requestインスタンスの代わりに、EmailVerificationRequestリクエストタイプを使用していることに気付くでしょう。EmailVerificationRequestはLaravelに含まれるフォームリクエストです。このリクエストは、リクエストのidとhashパラメータの検証を自動的に処理します。
次に、リクエストの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には、Illuminate\Auth\Middleware\EnsureEmailIsVerifiedミドルウェアクラスのエイリアスであるverifiedミドルウェアエイリアスが含まれています。このエイリアスは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のインスタンスを返す必要があります。通常、toMailUsingメソッドは、アプリケーションのAppServiceProviderクラスのbootメソッドから呼び出すべきです。
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イベントをディスパッチします。アプリケーションのメール認証を手動で処理している場合は、認証が完了した後にこれらのイベントを手動でディスパッチすることもできます。