Laravel 6 メールの認証を実装してみる(VerifyEmail)
いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。
Laravel 6 でメール認証(VerifyEmail)を実装する方法についてまとめました。
メール認証とは
システムからメールがユーザーが登録したメールアドレスに送信され、そのメールに添付された URL をクリックすることで認証を完了します。
メール認証したユーザーにだけ 使える機能やページを提供することができます。
バージョンによる違い
基本は User モデルに implements MustVerifyEmail
を追加するだけですが、
バージョンとスターターの違いに留意する必要があります。
Laravel 11、Jetstream なら → 【Laravel】Jetstream(Fortify)を使ってメール認証を実装する方法
今回は、Laravel 6 の Laravel UI を使った記事となります。
実装する
① モデルの変更
App/User.php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
//下記のように `implements MustVerifyEmail` を追記)
class User extends Authenticatable implements MustVerifyEmail
② ルーティングの変更
routes/web.php
Auth::routes(['verify' => true]);
// Before: Auth::routes();
以上で、メール認証をするためのコーディングは完了しています。
メール認証した人しか使えないルーティングの設定
routes/web.php
に書く場合
//verifiedを追加
Route::group(['middleware' => ['auth','verified']], function () {
//この中にメール認証したユーザーしか使えない機能のルーティングを書く
Route::get('/', 'HomeController@index');
Route::get('/posts', 'PostController@index');
}
もしルーティングの書き方が分からない場合、こちらで詳しく書いてます。
⇨ ログイン認証したユーザーだけが使えるルーティングの書き方
Controller の construct に書く場合
app/Http/Controllers/HomeController.php
public function __construct()
{
//verifiedを追加
$this->middleware(['auth','verified']);
}
この書き方をすると、HomeController の処理は全てメール認証した人にしか使えない機能になります。
web.php に書くか、Controller ごとに書くか好きな方でやりましょう。自分は web.php の方が分かりやすいと思っています。
やってはいけないこと
ログインページやメール認証のためのページでこのミドルウェアを通してしまうと、ログインできないシステムになってしまうので、ログインページなどのルーティングは必ず外に出しておきましょう
routes/web.php
//ダメな例
Route::group(['middleware' => ['auth','verified']], function () {
Auth::routes(['verify' => true]); //ログインができないので、絶対にアカン
}
メール送信の設定
開発中は メールトラップを使うのが簡単で便利です。
メールトラップ は、開発中、メール送信をテストするもので、テスト環境にあるメールアドレスに対して本当に送信するわけではなく、メールトラップの管理画面で無事送信されたかどうかを確認することができます。
本番環境では AWS の SES や Sendgrid と言ったメールサービスを使うことになりますが、それは.env を書き換えるだけで使えます。
【Laravel】メールトラップを使ってメール送信のテストをする方法
.env を修正
.env
には以下の項目が元々あります。それをメールトラップの管理画面からMAIL_USERNAME
とMAIL_PASSWORD
をコピペするだけで使うことができます。
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=???
MAIL_PASSWORD=??
MAIL_FROM_ADDRESS=from@example.com
MAIL_FROM_NAME=Example
コマンドで反映
php artisan config:clear
以上で完成です。
ログインすると、メール確認を求められます。
メールトラップの管理画面を見るとメールが届いており、そのメールのボタンをクリックすると、メール認証が完了します。
メール認証したユーザーを判別する仕組み
users テーブルのemail_verified_at
というカラムに、認証した日時が入っていれば認証されたとみなされます。
- 日時が入っている ⇨ メール認証済み
- 日時が入っていない ⇨ メール認証してない
ミドルウェアはここのカラムを見て通すか通さないかを判断しているようです。
まとめ
メール認証の実装をしてみました。
メールトラップの設定がよく分からない場合、画像付きで詳しく説明した記事があるのでそちらをみてみてください。