どうもこんにちは。
前回はソーシャルログインをがんばりました。
今回は、Laravel 5.7 で追加されたメール認証(Email Velification)をやってみます。
途中までは前回と同じなので、かなり雑な記事になることをご容赦ください。
前回の記事はコチラからどうぞ
Laravelでソーシャルログインをザザッと作る
目次
ユーザモデルを修正
こんな感じで修正します。
1 2 3 4 |
class User extends Authenticatable implements MustVerifyEmail { (略) } |
implements MustVerifyEmail
と追記するだけでおしまいです。
php artisan make:auth
でUserモデルが作られたときに、
すでにuse句は入ってました。優しさに涙が出ます。
ルーティングを修正
config/web.phpを修正します。
もともと
1 2 3 |
(略) Auth::routes(); (略) |
だったところを
1 2 3 |
(略) Auth::routes(['verify' => true]); (略) |
にするだけ。
あとは、メール認証が終わっていないとアクセスできないURLを設定しておくだけ。
1 2 3 |
Route::middleware('verified')->group(function() { // 本登録していないとアクセスできないURL }); |
今回は、Laravelの認証を有効にしたときに作られた「/home」に設定します。なので、こんな感じで編集しました。
1 |
Route::get('/home', 'HomeController@index')->name('home')->middleware('verified'); |
メールの設定
.envファイルにメールの設定をしておきます。
でないと、メール飛ばないので。これは、各環境にあわせてくださいませ。
ちなみに、今回私はmailtrap.ioを使いました。
詳しくは、こちらでどうぞ。⇒mailrtap.io
試す
サーバを起動して、http://localhost:8000/registerにアクセスします。
適当に入力して、registerボタンをクリック。
すると・・・?
http://localhost:8000/email/verifyにリダイレクトしました。
念のため、http://localhost:8000/homeにアクセスしても、上の画面にリダイレクトされます(至極当然)。
確認メール再送用のリンクもありますね。
ちなみに、userテーブルには、こんな感じで登録されています。
email_verified_atがnullです。
では、送信されたメールはというと
来てますね。真ん中の「Verify Email Address」をクリックします。
すると
はい、ログインした画面になりますね。
データは、というと
email_verified_atがに日付が入って、認証完了となってます。いいですね。
ちょっと思うこと
php artisan route:list
で、ルーティングの設定を見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
+--------+----------+---------------------------+---------------------+------------------------------------------------------------------------+------------------------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+---------------------------+---------------------+------------------------------------------------------------------------+------------------------------+ | | GET|HEAD | / | | Closure | web | | | GET|HEAD | api/user | | Closure | api,auth:api | | | GET|HEAD | email/resend | verification.resend | App\Http\Controllers\Auth\VerificationController@resend | web,auth,throttle:6,1 | | | GET|HEAD | email/verify | verification.notice | App\Http\Controllers\Auth\VerificationController@show | web,auth | | | GET|HEAD | email/verify/{id} | verification.verify | App\Http\Controllers\Auth\VerificationController@verify | web,auth,signed,throttle:6,1 | | | GET|HEAD | home | home | App\Http\Controllers\HomeController@index | web,verified,auth | | | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest | | | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest | | | GET|HEAD | login/{provider} | | App\Http\Controllers\Auth\LoginController@socialLogin | web,guest | | | GET|HEAD | login/{provider}/callback | | App\Http\Controllers\Auth\LoginController@handleProviderCallback | web,guest | | | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web | | | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web,guest | | | POST | password/reset | password.update | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest | | | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest | | | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest | | | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest | | | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest | +--------+----------+---------------------------+---------------------+------------------------------------------------------------------------+------------------------------+ |
verification.*
のところが、Auth::routes(['verify' => true]);
で追加されるルーティングですね。
middlewareに、authが含まれています。
authが含まれているってことは、ログインを要求されます。
Laravelでは、「メール認証されていなくてもとりあえずログインできる、けど機能が制限される」という思想で作られているようです。
本登録するまでログインもできない、という形にするのであれば、
・認証時にuser.email_verified_atがNULLの時はログイン失敗とする
・middleware”guest”(Kernel.phpによると、App\Http\Middleware\RedirectIfAuthenticatedが実体)で、ログイン済み状態判定に条件を追加
・VerificationControllerでmiddleware”auth”を適用しない
とすると、実現できるのかなーと思っています。
試す値打ちはありそうです。
まとめ
Laravel、すげーや(まとまってない)
R.TANAKAがお届けしました。