PHP
vagrant
mailtrap
Socialite
laravel5.5

Laravel5.5でメールの認証を実装する

参考資料

日本語が不思議な本記事を参考に、メール認証の処理を作成しました。

微妙に記述が足りなかったりしたので、補足していきます。

やったこと

基本的に参考記事のとおりですが、一番大きな違いはSocialiteを利用してるところです。
まあ、参考記事を参考にして雰囲気で実装したら動いたんですけど。

冷静に考えてソーシャルで取得したメールアドレスを確認する必要はない気はします。

とりあえずやったことは以下。

  1. ユーザーテーブルにverifiedとemail_tokenを追加してphp artisan migrate:refresh
  2. php artisan make:auth (すでに実行済みのため省略。あとverifiedが0のときログインできないように修正しました)
  3. .envの修正(mailtrapを利用しました。googleかgithubでログインしたらなんか勝手にメールアカウント的なものができているので、あとは雰囲気で利用できます)
  4. php artisan config:clear
  5. php artisan make:mail EmailVerification --markdown=emails.verification (emails/verification.blade.php(送信メール用テンプレート)とMail/EmailVerification.php(メール送信用クラス)が作成されます)
  6. Mail/EmailVerification.phpを修正
  7. emails/verification.blade.phpのURLを修正
  8. php artisan make:job SendVerificationEmail
  9. Jobs/SendVerificationEmail.phpを修正。JobじゃなくてJobs
  10. Auth/RegisterController.phpの修正。今回はSocialController.php
  11. verification.blade.phpを追加
  12. emailcomfirm.blade.phpを追加
  13. ルーティングの追加

まごついたところ

verifiedが0のときのログイン

ログイン処理に$user->verified == 0ならログインさせない処理を追加しました。
とりあえず『メール確認せーや』というメッセージを付けてトップに飛ばすようにしました。

が、メールを間違って消してしまった場合に備えて再送できる仕組みを作るべきなのかなと思いつつスルーしています。

単純な方法なら、ユーザーの作成時間を見て、一定時間以上古ければ登録済みのデータを削除して新しく作成し直す……とかでしょうか。

知らんけどー

6のEmailVerification.phpの修正内容が足りない

修正は以下の3つが書かれています。

  • Protected $userの追加
  • __constructに$this->user = $user;の追加
  • buildの戻り値にwith句で'email_token' => $this->user->email_token,を追加

もう一つ必要でした。

  • __constructの引数に$userの追加

これがないとJobs/SendVerificationEmail.phpから飛んでくる$userを受け取れません。

7のURLが間違ってる

'http://127.0.0.1:8000/verifyemail/$email_token'])とあります。

'http://127.0.0.1:8000/verifyemail/'.$email_token])の間違いです。

9の修正が間違ってる

EmailVerification.phpに対して$userを投げつけるために、こちらにもProtected $userが必要です。

これがないと__constructでdispatchから受け取った$userが揮発してしまい、handleでエラーになります。

10の修正について

useは適当に必要なものを追加します。

email_tokenに関しては$userの作成時に一緒に宣言します。

registerの修正はよくわからないので雰囲気で修正しました。
元々はそのままAuth::login($user)としていたところを、registerの下2行に変更。
トランザクションを利用していた関係でdispatchの方はトランザクション内に記述しましたが、問題なく動きました。

verifyの方はそのままで大丈夫でした。

13のルーティング

ソーシャル認証を利用しているので、RegisterControllerではなくSocialControllerですね。

mailtrapは本当にメールが届くわけではない

最初、本当にメールが届くんだと思って自分のアドレスを確認しまくってました。
ダミーのメールなので、実際には届かないとも知らず……。

「このアドレスにこんなメールが送られました!」というのがmailtrap側から確認できるだけです。

スクリーンショット 2018-05-06 20.21.45.jpg

こんな感じで。

verification.blade.phpが2つある

ややこしいんですがemails/verification.blade.phpとは別にverification.blade.phpを作れと言われます。

前者が送信するメールの内容(verifyボタンを押すとトークン付きのURLに飛ぶ)で、後者が『登録に成功しました、送信したメールから認証を完了させてください』的なことが書いてある画面です。

参考記事からコピペするとクォートがおかしい

なんか関連記事からクォートまわりをコピーしようとすると、クォートによく似た何かが取得できます。
html的に怒られるので注意です。