JetStreamでメール認証機能を実装してみよう

LaravelのJetStreamはインストール時は、URLさえ知っていれば、誰でもメール登録できるようになっています。そして、実際に存在しないメールアドレスでも登録できるようになっていますので、メール確認が取れなければ登録できないように変更してみたいと思います。

目次

メール確認機能の実装

STEP

Userモデルの確認

JetStreamをインストールしたばかりのデフォルトのUserモデルは、下記の様になっています。

<?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\Fortify\TwoFactorAuthenticatable;
use Laravel\Jetstream\HasProfilePhoto;
use Laravel\Jetstream\HasTeams;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens;
    use HasFactory;
    use HasProfilePhoto;
    use HasTeams;
    use Notifiable;
    use TwoFactorAuthenticatable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
        'two_factor_recovery_codes',
        'two_factor_secret',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
     * The accessors to append to the model's array form.
     *
     * @var array<int, string>
     */
    protected $appends = [
        'profile_photo_url',
    ];
}
STEP

MustVerifyEmailの実装

14行目を下記のように、implements MustVerifyEmaiを追加します。

use Illuminate\Contracts\Auth\MustVerifyEmail; //無ければ追加
// ...
class User extends Authenticatable implements MustVerifyEmail

  // 既存のコード
}

これで、ユーザーが新規にアカウントを登録する際に、メールアドレスの確認が必要になります。

STEP

メールサーバーの設定

実際にメールを送信するために、.env ファイルでメールサーバー(SMTPサーバーなど)の設定を行います。

デフォルトでは下記の様になっています。

MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
STEP

Xserverでの設定例

それでは、実際にメール送信するための設定例をXserverを使ってご紹介します。

  • Xserver>レンタルサーバー>サーバー管理>メールアカウント設定
  • ドメイン名を選択して、laravel@my-domain.jpでメールを作成します。
  • 作成したら、メールソフト設定をクリックします。
  • 設定対象ドメインが作成したメールソフトのドメインであることを確認します。
  • そこに記載されているSMTPサーバーをメモします。
  • Laravelの.envを開き、下記の様に記載します。
MAIL_MAILER=smtp
MAIL_HOST=svXXXXX.xserver.jp #XserverのSMTPサーバー
MAIL_PORT=587  # または、セキュリティ要件に応じて465(SSLの場合)
MAIL_USERNAME=laravel@my-domain.jp #作成したメールアドレス
MAIL_PASSWORD=my_password #設定したパスワード
MAIL_ENCRYPTION=tls  # SSLを使用する場合は、'ssl' に変更
MAIL_FROM_ADDRESS=laravel@my-domain.jp #作成したメールアドレス
MAIL_FROM_NAME="${APP_NAME}"
STEP

Route [verification.notice] not defined.エラー

何らかの原因で、上記のエラーが出る場合があります。その時の対処法を記載しておきます。

ルート確認

下記でverification.verifyルートの存在を確認をします。

php artisan route:list

php artisan route:list で verification.verify ルートがリストされていない場合、これはメール確認に関連するルートがアプリケーションに正しく登録されていないことを意味します。この問題を解決するためには、メール確認機能に必要なルートをアプリケーションに追加する必要があります。

Laravel Jetstreamを使用している場合、通常はメール確認ルートが自動的に設定されるはずですが、何らかの理由でこれが欠けている可能性があります。

メール確認ルートの手動追加

Laravel 8以降で、Auth::routes() が機能しない、または使用されていない場合、メール確認ルートを手動で追加することができます。

routes/web.php ファイルに以下のルートを追加します。

use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\Request;

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

Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
    $request->fulfill();
    return redirect('/dashboard');
})->middleware(['auth', 'signed'])->name('verification.verify');

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

キャッシュの追加

変更を反映させるために、ルートキャッシュをクリアします。

php artisan route:clear

ルートの確認

再度 php artisan route:list を実行して、verification.verify ルートがリストされていることを確認します。

STEP

再度登録処理

それでは、再度登録処理をしてみましょう。

すぐにダッシュボードに移動しなければ、大丈夫だと思います。

STEP

メール認証

ユーザー登録したメールに認証用のメールが送られてきたら、それをクリックすれば認証完了です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次