Laravel 5.xで用意されている認証機能は便利です。
ただデフォルトのまま使うと、本人認証なしで簡単に新規ユーザを作成できてしまいます。
具体的には新規登録画面で「ユーザ名」「メールアドレス」「パスワード」「確認用メールアドレス」を入力するだけで新規ユーザ登録が完了してしまいます。
このままだと、例えばロボットなどに大量に架空ユーザを登録されるなど懸念されます。
最近では、新規登録画面で必要情報を入力した後に、入力したメールアドレス宛に本人確認用のURLを送信して、ユーザ登録を完了するフローが主流です。
Laravelにもこのメールアドレス確認機能(Email Verification)が用意されてるようなので、早速試してみます。
認証機能を準備
はじめに準備として、以下のコマンドを実行すると、認証に必要なルートやビューを生成してくれます。
既に実行済みの場合は、こちらをスキップしてもらって構いません。
> php artisan make:auth
メールアドレス確認機能を有効にする
認証機能のメールアドレス確認機能を有効します。
まずモデル「app/User.php」を修正します。「use Illuminate\Contracts\Auth\MustVerifyEmail;」が読み込まれてることを確認し、以下のようにインターフェイスを実装します。
class User extends Authenticatable ↓ class User extends Authenticatable implements MustVerifyEmail
次にルート設定ファイル「routes/web.php」を編集します。
Auth::routes(); ↓ Auth::routes(['verify' => true]);
基本的な設定は以上です。
メールアドレス未確認ユーザを制限する
新規登録後、メールアドレスを確認できていないユーザを、任意のページにアクセスさせないためにはルート設定に「middleware(‘verified’)」を追加します。
例えば以下にようにすると未確認ユーザはページ「/profile」にアクセスできません。
Route::get('profile', 'ProfileController@index')->middleware('verified');
動作確認
では実際にメールアドレス確認が機能しているか確認したいと思います。
まずユーザ新規登録画面「/register」にアクセスして必要情報を入力します。
登録が完了した状態でuserテーブルを確認してみると、登録したユーザ情報のカラムemail_verified_atの値がnullになっています。
登録したメールアドレスに本人確認メールが届いてるいるので、メールを開いてそこに記載されてるURLにアクセスします。以下、URLの例です。
http://helog.jp/email/verify/1?expires=0123456789&signature=xxxxxxxx
ログイン状態でなければログインします。
URLにアクセスするとメールアドレス確認完了です。
先ほどのカラムemail_verified_atをもう一度確認してみると日付がセットされているのが確認できると思います。
ログイン状態で「/profile」にアクセスでいることも確認できるはずです。
コメントする