コンテンツにスキップ

メール認証

イントロダクション

多くのWebアプリケーションでは、アプリケーションを使用する前にユーザーにメールアドレスの確認を求めています。Laravelは、作成するアプリケーションごとにこの機能を手動で再実装することを強制するのではなく、メール確認リクエストを送信および確認するための便利な組み込みサービスを提供しています。

lightbulb

すぐに使い始めたいですか? 新しいLaravelアプリケーションにLaravelアプリケーションスターターキットのいずれかをインストールします。スターターキットは、メール確認のサポートを含む認証システム全体の足場を構築します。

モデルの準備

始める前に、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;
 
// ...
}

このインターフェースがモデルに追加されると、新しく登録されたユーザーには、メール確認リンクを含むメールが自動的に送信されます。LaravelはIlluminate\Auth\Events\RegisteredイベントのIlluminate\Auth\Listeners\SendEmailVerificationNotification リスナーを自動的に登録するため、これはシームレスに発生します。

スターターキットを使用する代わりに、アプリケーション内で手動で登録を実装する場合は、ユーザーの登録が成功した後にIlluminate\Auth\Events\Registeredイベントをディスパッチしていることを確認する必要があります。

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

データベースの準備

次に、usersテーブルには、ユーザーのメールアドレスが確認された日時を格納するためのemail_verified_atカラムが必要です。通常、これはLaravelのデフォルトの0001_01_01_000000_create_users_table.phpデータベースマイグレーションに含まれています。

ルーティング

メール確認を正しく実装するには、3つのルートを定義する必要があります。まず、Laravelが登録後に送信した確認メールのメール確認リンクをクリックするようにユーザーに通知を表示するためのルートが必要です。

次に、ユーザーがメールのメール確認リンクをクリックしたときに生成されるリクエストを処理するためのルートが必要です。

3つ目に、ユーザーが最初の確認リンクを誤って紛失した場合に、確認リンクを再送信するためのルートが必要です。

メール確認通知

前述のように、Laravelが登録後にユーザーにメールで送信したメール確認リンクをクリックするようにユーザーに指示するビューを返すルートを定義する必要があります。このビューは、ユーザーがメールアドレスを確認せずにアプリケーションの他の部分にアクセスしようとすると表示されます。App\Models\UserモデルがMustVerifyEmailインターフェースを実装している限り、リンクはユーザーに自動的にメールで送信されます。

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

メール確認通知を返すルートには、verification.noticeという名前を付ける必要があります。Laravelに含まれるverifiedミドルウェアは、ユーザーがメールアドレスを確認していない場合、このルート名に自動的にリダイレクトされるため、ルートにこの正確な名前が割り当てられていることが重要です。

lightbulb

メール確認を手動で実装する場合、確認通知ビューの内容を自分で定義する必要があります。必要なすべての認証および確認ビューを含む足場が必要な場合は、Laravelアプリケーションスターターキットを確認してください。

メール確認ハンドラ

次に、ユーザーがメールで送信されたメール確認リンクをクリックしたときに生成されるリクエストを処理するルートを定義する必要があります。このルートには、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');

先に進む前に、このルートを詳しく見てみましょう。まず、通常のIlluminate\Http\Requestインスタンスの代わりに、EmailVerificationRequestリクエストタイプを使用していることに気付くでしょう。EmailVerificationRequestは、Laravelに含まれるフォームリクエストです。このリクエストは、リクエストのidおよびhashパラメータの検証を自動的に処理します。

次に、リクエストのfulfillメソッドを直接呼び出すことができます。このメソッドは、認証されたユーザーのmarkEmailAsVerifiedメソッドを呼び出し、Illuminate\Auth\Events\Verifiedイベントをディスパッチします。markEmailAsVerifiedメソッドは、Illuminate\Foundation\Auth\User基本クラスを介してデフォルトのApp\Models\Userモデルで使用できます。ユーザーのメールアドレスが確認されたら、好きな場所にリダイレクトできます。

確認メールの再送信

ユーザーがメールアドレス確認メールを紛失したり、誤って削除したりすることがあります。これに対応するために、ユーザーが確認メールの再送信をリクエストできるようにするルートを定義することをお勧めします。確認通知ビュー内に単純なフォーム送信ボタンを配置することで、このルートにリクエストを送信できます。

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');

ルートの保護

ルートミドルウェアを使用して、確認済みのユーザーのみが特定のルートにアクセスできるようにすることができます。Laravelには、Illuminate\Auth\Middleware\EnsureEmailIsVerifiedミドルウェアクラスのエイリアスであるverified ミドルウェアエイリアスが含まれています。このエイリアスはLaravelによって既に自動的に登録されているため、ルート定義にverifiedミドルウェアを添付するだけで済みます。通常、このミドルウェアはauthミドルウェアと組み合わせて使用​​されます。

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

未確認のユーザーがこのミドルウェアが割り当てられているルートにアクセスしようとすると、verification.notice 名前付きルートに自動的にリダイレクトされます。

カスタマイズ

確認メールのカスタマイズ

デフォルトのメール確認通知はほとんどのアプリケーションの要件を満たしているはずですが、Laravelではメール確認メールメッセージの構築方法をカスタマイズできます。

開始するには、`Illuminate\Auth\Notifications\VerifyEmail` 通知が提供する `toMailUsing` メソッドにクロージャを渡します。クロージャは、通知を受け取る通知可能モデルインスタンスと、ユーザーがメールアドレスを検証するためにアクセスする必要がある署名付きメール検証URLを受け取ります。クロージャは `Illuminate\Notifications\Messages\MailMessage` のインスタンスを返却する必要があります。通常、`toMailUsing` メソッドは、アプリケーションの `AppServiceProvider` クラスの `boot` メソッドから呼び出す必要があります。

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);
});
}
lightbulb

メール通知の詳細については、メール通知ドキュメントを参照してください。

イベント

Laravel アプリケーションスターターキットを使用する場合、Laravel はメール検証プロセス中に `Illuminate\Auth\Events\Verified` イベントをディスパッチします。アプリケーションのメール検証を手動で処理する場合は、検証が完了した後にこれらのイベントを手動でディスパッチすることをお勧めします。