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をクリックして、通常通りログインできる事を確認できれば実装完了!