2行でできるLaravel Breeze標準機能を使ったメール認証 | アントレプログラマー

2行でできるLaravel Breeze標準機能を使ったメール認証

Laravel

こんにちは、ニキです。

Laravel Breezeは、認証システムを簡単かつ迅速にセットアップするため有用な機能です。今回は、Laravel Breezeの標準機能を使用して、たった2行のコード変更でメール認証を追加する方法をご紹介します。

Takaharu Niki

・Webエンジニア5年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする

事前準備

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を活用して、セキュリティと利便性のバランスをとりながら、優れたユーザーエクスペリエンスを提供しましょう。

効率的に学習するならプログラミングスクールの検討もありです。

さらに詳しく学びたい方は、以下の書籍がおすすめです。

PHPフレームワークLaravel Webアプリケーション開発 バージョン8.x対応

既にLaravelの基本を知っていてスキルアップを図りたい開発者にとって、かなりおすすめです。クリーンなコーディング、保守性、テストの容易さなど、Laravelの提供する現代的なWeb開発のベストプラクティスを体系的に学べる内容が含まれています。

Takaharu Niki

・Webエンジニア5年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする
Laravel
Takaharu Nikiをフォローする
アントレプログラマー
タイトルとURLをコピーしました