会員登録を行ったあとに、そのメールアドレスが本人のものかどうかを確認するために認証メールを発行する Web アプリケーションが最近では増えてきました。
Laravel でも同様の認証メールの発行を行おうと思い Mailable クラスを作成して、登録時に送信するというのを作ったのですが、肝心な認証メールの処理がうまくできませんでした。
調べているうちに Laravel5.7
からはMustVerifyEmail
というインターフェースを使うことで、会員登録時に自動でメールの発行とメールアドレスの認証処理まで行ってくれるようです。
認証メール発行の実装
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
以下に作成されます。