hoge

いわゆるWeb Developerの備忘録

【Laravel】会員登録時にメールアドレス認証を発行する

会員登録を行ったあとに、そのメールアドレスが本人のものかどうかを確認するために認証メールを発行する Web アプリケーションが最近では増えてきました。

Laravel でも同様の認証メールの発行を行おうと思い Mailable クラスを作成して、登録時に送信するというのを作ったのですが、肝心な認証メールの処理がうまくできませんでした。

調べているうちに Laravel5.7 からはMustVerifyEmailというインターフェースを使うことで、会員登録時に自動でメールの発行とメールアドレスの認証処理まで行ってくれるようです。

メール確認 5.7 Laravel

認証メール発行の実装

php artisan make:authがすでに実行されていることを前提にします。

User クラスを作った際に、use で呼び出されているが使われていないMustVerifyEmailインターフェースを継承します。

/** 省略 */
use Illuminate\Contracts\Auth\MustVerifyEmail;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;
    /** 省略 */
}

これだけでユーザ登録が行われた際に、登録したメールアドレス宛に認証確認メールが送信されるようになります。

ただメールが送信されるだけで、認証確認を行う機能がないので、認証コントローラーを使えるようにAuth::route()を変更します。

Auth::route(['verify' => true]);

有効にすることで認証メールの URL をクリックした際にVerificationControllerを通して確認が行われるようになります。

メールの確認がされるとユーザのemail_verifed_atカラムに確認した日時が登録されます。

メールの確認有無によって、会員の機能を制限したい場合はmiddleware('verified')を付与することで確認されていない会員がその機能を使えなくなります。

Vue の場合

Blade を使っている場合は以上で十分なのですが、
今回フロントエンドに Vue を使っているので、Vue で使えるように一部を変更します。

認証メールに書かれている URL にアクセスすると、admin.loginというルートが呼ばれるのですが、Vue の場合対応する URL にアクセスするように変更する必要があります。

LoginController の AuthenticatesUsers に定義されているメソッドを LoginController 上でオーバーライドして、対応する URL にリダイレクトさせるようにします。

/**
  * Show the application's login form.
  *
  * @return \Illuminate\Http\Response
  */
protected function showLoginForm()
{
    return redirect('login');
}

ログイン済みの場合、認証に成功しリダイレクトされるので/homeというルートがない場合は VerificationController の URL も任意のものに変更します。

protected $redirectTo = '/';

まとめ

最初に自作で用意しようとするのが馬鹿らしくなったくらい Laravel は充実していると感じました。

認証メールは標準で英語ですが変更も可能です。メールのレイアウトはphp artisan vendor:publshをコンソールから実行し、[13] Tag: laravel-notificationsが該当するので、13 と入力するとresources/view以下に作成されます。


同じカテゴリー(PHP)の記事
上の画像に書かれている文字を入力して下さい
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
【Laravel】会員登録時にメールアドレス認証を発行する
    コメント(0)