Laravelでの開発をしていて、ユーザー登録に「メール認証」を使った2段階の認証方法を使いたい。

という場合もあるかと思います。

「Laravel Breeze」を使っている場合、とても簡単にメール認証機能を追加できてしまいます。

ほぼ手間なくセキュリティ面の向上ができるので、以下の内容などを参考に使ってみてください〜。

前提

LaravelプロジェクトとLaravel Breezeの導入が完了している

大前提として、すでにLaravelプロジェクトを立ち上げており、Laravel Breezeのインストールが完了している必要があります。

Laravel Breeze自体がLaravel8.0以降に登場した機能(だったはず。)なので、必然的にLaravelバージョンは8.0以上になると思います。

・Laravel Breezeを使って認証機能をすでに作っている

Laravel Breezeのインストールが完了しており、マイグレーションをしていれば自動的に認証機能は作られていると思います。

もし、Laravel Breezeのインストール・マイグレーションなどがまだの場合は、以下(公式)などを参考に進めてみてください。

https://readouble.com/laravel/9.x/ja/starter-kits.html

・メールの設定が完了している

メールでの認証を行うので、メール設定が完了している必要があります。

Laravelのメールの設定は「.env」ファイルの以下の部分を変更する必要があります。

MAIL_MAILER=smtp
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=*********
MAIL_PASSWORD=*********

この例は開発段階などで重宝する「MailTrap」を使用しています。

内容はあなたの状況に合わせて適宜調整してくださいまし。

STEP1 : Userモデルを変更

実は、メール認証機能はLaravel内にデフォルトで用意されています。(デフォルトでは無効)

これを有効化するためには「User モデル」でメール認証機能を使う。という設定に変更する必要があります。

必要となる名前空間や書き方などは以下のようになります。「MustVerifyEmail」インターフェイスを実装(呼び出す)だけです。

【app/Models/User.php】

app/Models/User.php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail; // <-これを有効化(コメントアウトの場合外す)
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

// MustVerifyEmailインターフェイスを実装
class User extends Authenticatable implements MustVerifyEmail 
{
    use Notifiable;
}

ポイント

「Userモデル」はユーザー登録などで使用されるモデルなので、ここを上記のように変更することで、認証方法がメールによる認証が必須になります。

このSTEPが無事に完了していれば、ユーザー登録時に認証用のメールが送信されると思います。

このメール内の認証ボタンを押すと、晴れてメール認証が完了します。

次は「メール認証を完了させたユーザーのみアクセスを可能にする」という設定をしていきます。

STEP2: ルート(ミドルウェア)の設定

メール認証を完了させたユーザーのみアクセス可能。という形に変更していきます。

制限したいページのミドルウェアを「auth」から「verified」に変更、または、両方使うようにします。(以下は両方使っているパターンです)

 【routes/web.php】

Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');

ポイント

ミドルウェアを「verify」とすることでSTEP1で設定した「メール認証を完了させたユーザー」のみのアクセスが可能になります。

おまけとして送信されるメールの日本語化についても軽く。。

STEP3: メール内容の日本語化(おまけ)

Laravel Breezeを使う場合の日本語化は「breeze.jp」という便利なライブラリがあります。

日本語化の手順はざっくりですが以下の手順になります。

  1. 「config/app.php」のlocale部分を「locale => ja」に変更
  2. 以下のコマンドを入力して「lang」を作成
php artisan lang:publish

3. lang/en をコピぺして、名前を「ja」に変更。

4. lang/ に「ja.json」を作成(中身は空でOK)

5. 以下のコマンドで「breeze.jp」をインストール&有効化

php composer require askdkc/breezejp --dev

php artisan breezejp

何事もなければ、Laravel Breeze環境内のログインや、メールの内容も日本語化されると思います。

まとめ

LaravelプロジェクトとLaravel Breezeの初期設定が完了していれば、かなり少ない手順でメール認証・メールの日本語化が完了することが伝わったかと思います。

ゆたんぽ

簡単さが伝わったらいいなー

ぬこ先生

古いバージョンで自作してたのと比較したら一瞬で完成するニャ

手間も少なくセキュリティ面の向上につながるので、ぜひメール認証を入れてみてください〜。