こんにちは、ニキです。
Laravel Breezeは、認証システムを簡単かつ迅速にセットアップするため有用な機能です。今回は、Laravel Breezeの標準機能を使用して、たった2行のコード変更でメール認証を追加する方法をご紹介します。
事前準備
Laravel Breeze の インストール
Next.jsの使用を前提にしていますが、以下でLaravel Breezeのインストール方法を紹介しています。
Databaseの準備
user
テーブルはユーザーのメールアドレスが認証された日時を保存するemail_verified_at
カラムを持っているはずです。デフォルトで、user
テーブルのマイグレーションはこのカラムをすでに含んでいます。まだマイグレーションをしていない場合は、以下のコマンドを実行します。
php artisan migrate
Laravel Breeze でメール認証を実装する
modelの準備
以下のようにApp\\Models\\User
modelに Illuminate\\Contracts\\Auth\\MustVerifyEmail
contractを実装します。
<?php
namespace App\\Models;
use Illuminate\\Contracts\\Auth\\MustVerifyEmail;
use Illuminate\\Database\\Eloquent\\Factories\\HasFactory;
use Illuminate\\Foundation\\Auth\\User as Authenticatable;
use Illuminate\\Notifications\\Notifiable;
use Laravel\\Sanctum\\HasApiTokens;
class User extends Authenticatable implements MustVerifyEmail
{
use HasApiTokens, HasFactory, Notifiable;
// ...
}
このインターフェースがUserクラスに実装されてから、新しく登録されたユーザーはメール認証リンクを含むメールを自動的に送信されます。App\\Providers\\EventServiceProvider
の中にIlluminate\\Auth\\Events\\Registered
イベントにアタッチしたIlluminate\\Auth\\Listeners\\SendEmailVerificationNotification
リスナーがすでに定義されています。このイベントリスナーがユーザーにメール認証リンクを送信します。
以下のように実装されています。
<?php
namespace App\\Providers;
use Illuminate\\Auth\\Events\\Registered;
use Illuminate\\Auth\\Listeners\\SendEmailVerificationNotification;
use Illuminate\\Foundation\\Support\\Providers\\EventServiceProvider as ServiceProvider;
use Illuminate\\Support\\Facades\\Event;
class EventServiceProvider extends ServiceProvider
{
/**
* The event to listener mappings for the application.
*
* @var array<class-string, array<int, class-string>>
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
スタータキットを使わずに登録処理を手動で実装する場合は、ユーザー登録が成功した後にIlluminate\\Auth\\Events\\Registered
イベントをディスパッチします。
use Illuminate\\Auth\\Events\\Registered;
event(new Registered($user));
スターターキットを使っている場合は、App\Http\Controllers\Auth\RegisteredUserController::storeでIlluminate\\Auth\\Events\\Registered
イベントをディスパッチしています。
ルートの保護
メール認証がまだの場合にルートを保護したいので、middlewareとしてverifiedをルートに追加します。ルートはapi.phpに定義しています。
これにより、
- ユーザー認証がされていない場合:auth:sanctumによって、ログイン画面にリダイレクトされます。
- ユーザー認証はされているが、メールの確認がまだの場合:verifiedによって、認証メール再送信画面にリダイレクトされます。
Route::middleware(['auth:sanctum', 'verified'])->get('/user', function (Request $request) {
return $request->user();
});
まとめ
Laravel Breezeを用いたメール認証は、単純ながらもアプリケーションのセキュリティを大幅に強化する手法です。わずか2行のコード変更で、ユーザー登録プロセスにメール認証を組み込むことができるため、開発者は迅速に信頼できる認証システムを実装できます。Laravel Breezeを活用して、セキュリティと利便性のバランスをとりながら、優れたユーザーエクスペリエンスを提供しましょう。