laravel5.5でメール認証を実装してみる(ユーザ登録したらメール送信してクリックしたらアクティベーションされる奴)。パスワードリセットみたいに標準であるかな?と思ったら無かった・・・。
参照URL
https://qiita.com/harukazuchi/items/32fe88f87db3b4a5fe79
https://qiita.com/namixc/items/39577024d5aa4932103d
1, usersテーブルに2カラム追加
1 2 |
$table->tinyInteger('email_verified')->default(0)->comment('0=未確認、1=確認済'); $table->string('email_verify_token')->nullable()->comment('email確認済になった後の識別トークン'); |
2, メール送信クラスを生成
app/Mail/EmailVerification.phpが生成される。
1 |
php artisan make:mail EmailVerification |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Queue\ShouldQueue; class EmailVerification extends Mailable { use Queueable, SerializesModels; // クラス変数にユーザ情報を追加して、クラス生成時にユーザ情報を確保 protected $user; public function __construct($user) { $this->user = $user; } // メール送信処理 public function build() { // メールのタイトル・bladeファイル・変数をセット return $this ->subject('【site】仮登録が完了しました') ->view('auth.email.pre_register') ->with(['token' => $this->user->email_verify_token,]); //return $this->view('view.name'); } } |
3, メールの内容を記述。以下のファイルを自分で作る
resources/views/auth/email/pre_regsiter.blade.php
1 2 3 4 |
サイトへのアカウント仮登録が完了しました。<br> <br> 以下のURLからログインして、本登録を完了させてください。<br> {{url('register/verify/'.$token)}} |
4, メール送信後のサンクス画面を作る
resources/views/auth/email/regsitered.blade.php
1 |
確認メールを送ったから、受信してメール内のURLをクリックすれば登録完了! |
5, ユーザの新規作成処理に、クリックするURL生成とメール送信を記述する
app/Http/Controller/Auth/RegisterController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
protected function create(array $data) { $user = User::create([ 'username' => $data['username'], 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), // emai認証用のURLトークン(重複さえしなければ、なんでも良い) 'email_verify_token' => hash("sha256", uniqid(rand(), true)), ]); // ユーザレコードを生成したら、認証用メール送信する $email = new EmailVerification($user); Mail::to($user->email)->send($email); return $user; } |
6, 登録時の自動ログインを無効化して、サンクス画面を表示する
1 2 3 4 5 6 7 8 9 10 |
// laravel標準のユーザ登録だと、ユーザ登録した直後に自動的にログインしてしまう。 // そこでオーバーライドする(サンクス画面を表示して、ログイン処理は行わない!) // vendor\laravel\framework\src\Illuminate\Foundation\Auth\RegistersUsers.php public function register(Request $request) { // createメソッドを読んで、ユーザ生成する event(new Registered($user = $this->create( $request->all() ))); // メール送ったから、クリックしろ画面を表示 return view('auth.registered'); } |
7, メール認証用URLをクリックされたら、ユーザがログインできる(
アクティベーション処理)ようにする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
// web.php Route::match(['get','post'], 'register/verify/{token}', 'Auth\RegisterController@verify'); // メール認証用URLをクリックされたら public function verify($email_token) { // メールに記載されたURLトークンをキーに、ユーザ情報を取得 $user = User::where('email_verify_token', $email_token)->first(); $dt_now = new Carbon(); $dt_create = new Carbon($user->created_at); $dt_limit = $dt_create->addHour(); // 登録されているトークンか? if(!$user){ $verify_message = '無効なトークンです。'; // メール認証済ユーザーか? }else if($user->email_verified){ $verify_message = 'すでに本登録されています。ログインして利用してください。'; // メール認証の発行から一時間以上経過している? }else if($dt_now->gt($dt_limit) ){ $verify_message = 'メール認証の発行から一時間以上経過しています。新規アカウントを作成して下さい'; // まだメール未認証ユーザなら }else{ // メール認証済にして、上書き保存 $user->email_verified = true; if($user->save()) { $verify_message = 'メール認証されました。ログインして利用してください。'; } else{ $verify_message = 'メール認証に失敗しました。再度、メールからリンクをクリックしてください。'; } } // メール認証の結果を画面を表示(ログイン画面へのリンク付き) return view('auth.email_verify_result')->with('verify_message', $verify_message); } |
8, 後は、メール内のURLをクリックして、通常通りログインできる事を確認できれば実装完了!