Lang x Lang

Email Verification

Table of Contents

Introduction

多くの web アプリケーションでは、 application を使用する前に users が自分の email アドレスを確認する必要があります。手作業でこの feature を各 application で再実装するのではなく、 Laravel は便利な組み込みの services を提供して、 email verification のリクエストを送信し、確認することができます。

NOTE

すぐに始めたいですか?新規の Laravel application にLaravel application のスターターキットをインストールしてみてください。スターターキットにより、 email verification サポートを含む全体的な authentication システムの足場が整います。

Model の準備

始める前に、あなたのApp\Models\User model がIlluminate\Contracts\Auth\MustVerifyEmail コントラクトを実装していることを確認してください:

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    // ...
}

このインターフェースがあなたの model に追加されると、新しく登録された users には自動的に email verification リンクが含まれた email が送信されます。これは、 Laravel が自動的にIlluminate\Auth\Listeners\SendEmailVerificationNotification listenerIlluminate\Auth\Events\Registered event に登録するため、シームレスに行われます。

starter kitを利用せずに、application 内で登録を手動で実装している場合、user の登録が成功した後にIlluminate\Auth\Events\Registered event を dispatch していることを確認する必要があります:

use Illuminate\Auth\Events\Registered;

event(new Registered($user));

Database Preparation

次に、あなたのusersテーブルには、ユーザーの email アドレスが確認された日時を保存するためのemail_verified_at column が含まれていなければなりません。通常、これは Laravel の default 0001_01_01_000000_create_users_table.php database マイグレーションに含まれています。

Routing

email verification を適切に実装するためには、3 つの routes を定義する必要があります。まず、user に email verification の link をクリックするように通知するための route が必要です。この link は、Laravel が登録後に user に送った確認用の email の中にあります。

二つ目、 user が email の中の email verification リンクをクリックすると発生するリクエストを handle するための route が必要になります。

三つ目に、もし user が最初の確認リンクを誤って失った場合、確認リンクを再送するための route が必要となります。

Email Verification 通知

前述の通り、登録後に Laravel から送信された email verification のリンクを user にクリックさせるように指示する view を返す route を定義する必要があります。この view は、 users が他の application の部分にアクセスしようとしたときに、まず email アドレスを確認せずに表示されます。リンクは自動的に user にメールで送信されます、あなたの App\Models\User model が MustVerifyEmail インターフェースを実装している限り。

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

email verification の通知を返す route は、verification.noticeと名付けるべきです。 route にこの正確な名前が割り当てられていることが重要です。なぜなら、verified middleware が“ Laravel 付属で、 user が email アドレスを確認していない場合、自動的にこの route 名に redirect するからです。

NOTE

email verification を手動で実装する際には、 view の検証通知の内容をご自身で required 定義する必要があります。全ての必要な authentication 和検証 views を含む足場が欲しい場合は、Laravel application スターターキットをご覧ください。

Email Verification Handler

次に、 user がメールで送られた email verification のリンクをクリックしたときに生成されるリクエストを handle する route を定義する必要があります。 この route はverification.verifyと名付けられ、authsignedのミドルウェアに割り当てられるべきです:

use Illuminate\Foundation\Auth\EmailVerificationRequest;

Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
    $request->fulfill();

    return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');

次へ進む前に、この route をよく見てみましょう。まず、通常のIlluminate\Http\Requestインスタンスではなく、EmailVerificationRequestという request type を使用していることに気付くでしょう。EmailVerificationRequestは、 Laravel とともに提供されるform requestです。この request は、リクエストのidhashパラメータの validating を自動的に行います。

次に、fulfillという method を直接 request に呼び出すことができます。この method は、authentication された user のmarkEmailAsVerifiedという method を呼び出し、Illuminate\Auth\Events\Verifiedという event を dispatch します。 markEmailAsVerifiedの method は、 default のApp\Models\Userという model にIlluminate\Foundation\Auth\Userの基本 class を介して利用できます。ユーザーの email が確認されると、あなたは彼らを希望する場所に redirect することができます。

認証 Email の再送信

時折、 user が誤って email アドレスの確認の email を紛失したり delete したりすることがあります。このような事態に対応するため、 user が確認の email を再送信するように request できる route を定義することができます。その後、確認通知の view にシンプルな形式の送信 button を設置することで、この route への request を行うことができます。

use Illuminate\Http\Request;

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

Protecting Routes

ルートミドルウェア は、特定の route にアクセスできるのは確認済みの users のみに制限するために使用できます。Laravel には、verified ミドルウェア alias が含まれており、これは Illuminate\Auth\Middleware\EnsureEmailIsVerified ミドルウェア class の alias です。この alias はすでに Laravel によって自動的に登録されているため、必要なことは verified middleware を route 定義に attach することだけです。通常、この middleware は auth middleware とペアになっています。

Route::get('/profile', function () {
    // Only verified users may access this route...
})->middleware(['auth', 'verified']);

未認証の user がこの middleware に割り当てられた route にアクセスを試みた場合、自動的に verification.notice 名前付き route にリダイレクトされます。

Customization

Email カスタマイズの確認

default の mail 確認通知は、ほとんどの application の要件を満たすはずですが、Laravel では mail 確認 mail メッセージがどのように構築されるかをカスタマイズすることができます。

始めるためには、Illuminate\Auth\Notifications\VerifyEmail 通知が提供するtoMailUsing method にクロージャを渡します。クロージャは、通知を受け取っている model インスタンスと、user が mail アドレスの確認をするために訪れる必要がある署名付き mail 確認 URL を受け取ります。クロージャは Illuminate\Notifications\Messages\MailMessage のインスタンスを返すべきです。通常、application の AppServiceProvider class の boot method から toMailUsing method を呼び出すべきです。

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

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    // ...

    VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
        return (new MailMessage)
            ->subject('Verify Email Address')
            ->line('Click the button below to verify your email address.')
            ->action('Verify Email Address', $url);
    });
}

NOTE

mail notifications について詳しく学びたい場合は、mail notification ドキュメンテーションをご参照ください。

Events

Laravel application スターターキットを使用するとき、Laravel は、 Illuminate\Auth\Events\Verified eventsを email verification process 中に発行します。自分の application の mailauthentication を手動で行っている場合、authentication が完了した後にこれらの イベント を手動で dispatch することを検討するかもしれません。

当社サイトでは、Cookie を使用しています。各規約をご確認の上ご利用ください:
Cookie Policy, Privacy Policy および Terms of Use