【Laravel】メールアドレス認証について解説

laravelアイキャッチ Laravel

こんにちは、かつコーチです。

今回は、Laravelにおけるメールアドレスの認証機能について解説します。

LaravelのEmail Verification(メールアドレスの認証)機能は、

ユーザーがアカウント登録後にメールを通じてアカウントを認証する仕組みを提供します。

これにより、ユーザーが提供したメールアドレスの信頼性を確認し、

不正なユーザーの登録や不適切な使用を防ぐことができます。

Laravelは、この機能を簡単に導入できるように、デフォルトでサポートを提供しており、

BreezeやJetstreamの認証スキャフォールディングを使うと、すぐにメール認証機能を導入できます。

機能の概要

Laravelのメールアドレス認証機能は、以下のような流れで動作します。

  1. ユーザー登録:ユーザーが新規アカウントを作成すると、確認用のメールが送信されます。
  2. 確認メールの送信:このメールには、ユーザーがメールアドレスを確認するためのリンクが含まれています。
  3. メールリンクのクリック:ユーザーがメール内のリンクをクリックすると、そのリンクを通じてシステム側がユーザーのメールアドレスを確認します。
  4. 認証後のリダイレクト:メール認証が完了すると、ユーザーは指定されたページにリダイレクトされ、以降の操作が可能になります。

メール認証機能の設定

Laravelでメール認証機能を使うには、いくつかの設定を行います。

ユーザーモデルにMustVerifyEmailインターフェースの実装

まず、メールアドレスの認証が必要なユーザーモデル(通常はUserモデル)に、MustVerifyEmailインターフェースを実装します。

use Illuminate\Contracts\Auth\MustVerifyEmail;

class User extends Authenticatable implements MustVerifyEmail
{
    // ...
}

これにより、そのユーザーモデルがメール認証を必要とすることが指定されます。

ルートの設定

Laravelのルーティングは認証ルートを用意しており、

authミドルウェアのverifiedオプションを使って認証が済んでいないユーザーに

アクセス制限をかけることができます。

通常の設定では、Auth::routes(['verify' => true])を使って、認証関連のルートを有効にします。

これにより、以下のルートが自動的に設定されます。

  • /email/verify: 認証が必要なユーザーがアクセスした際に表示されるページ
  • /email/verification-notification: 認証メールを再送信するためのエンドポイント
  • /email/verify/{id}/{hash}: メールに含まれる認証リンクがアクセスされると、認証が完了するエンドポイント

ミドルウェアの設定

Laravelでは、メール認証が完了していないユーザーに対して、アクセス制限をかけることができます。

このために、verifiedミドルウェアを使用します。

Route::get('/home', [HomeController::class, 'index'])
    ->middleware(['auth', 'verified']);

この設定により、/homeページはメール認証を完了したユーザーのみがアクセスできるようになります。

認証通知のカスタマイズ

Laravelでは、メールの通知内容を簡単にカスタマイズできます。

Illuminate\Auth\Notifications\VerifyEmailクラスをオーバーライドして、

メールの内容やテンプレートを変更することが可能です。

例として、メール本文を変更したい場合は、このクラスを拡張して独自の通知クラスを作成できます。

use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;

class CustomVerifyEmail extends VerifyEmail
{
    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('メールアドレスの確認')
            ->line('こちらのボタンをクリックして、メールアドレスの認証を完了してください。')
            ->action('メールアドレスを確認する', $this->verificationUrl($notifiable))
            ->line('もしこのメールに心当たりがない場合は、このメッセージを無視してください。');
    }
}

メールの再送信

ユーザーが認証メールを紛失したり、受信できなかった場合、

認証メールの再送信機能を提供することもできます。

デフォルトのルートを使用すると、

/email/verification-notificationにPOSTリクエストを送信することで、

メールの再送信を行うことができます。

Route::post('/email/verification-notification', function (Request $request) {
    $request->user()->sendEmailVerificationNotification();

    return back()->with('message', '確認メールを再送信しました。');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

BreezeやJetstreamを使った簡単な導入

Laravelでのメール認証機能は、BreezeやJetstreamといった

認証スキャフォールディングを使うことで簡単に導入できます。

これらのパッケージには、メール認証のための設定やルーティング、

ビューなどがすでに含まれているため、即座に利用可能です。

  • Breeze: シンプルで最小限のスタック。基本的な認証機能を素早く提供。
  • Jetstream: より多機能で、2要素認証やチーム管理、APIトークンなどの機能が含まれています。

Breezeでの設定

Breezeをインストールすると、最初からメール認証のためのルーティングやビューが設定されています。インストール手順は以下の通りです。

composer require laravel/breeze --dev
php artisan breeze:install
npm install && npm run dev
php artisan migrate

これで、メール認証を含む基本的な認証機能が有効になります。


まとめ

  • LaravelのEmail Verificationは、ユーザーのメールアドレスを認証し、安全で信頼性の高い認証システムを実装するための機能。
  • ユーザーモデルにMustVerifyEmailインターフェースを実装し、認証関連のルートやミドルウェアを設定するだけで簡単に導入可能。
  • BreezeJetstreamを使うことで、すぐにメール認証機能を取り入れることが可能。
  • Laravelのメール通知システムを利用して、認証メールの内容やテンプレートを柔軟にカスタマイズできる。

このように、Laravelのメール認証はセキュリティ強化や不正登録防止に非常に有効な手段であり、

簡単に導入・設定ができるため、認証機能を必要とするWebアプリケーションでは

積極的に活用することが推奨されます。

タイトルとURLをコピーしました