ユーザーが登録メールアドレスを変更した際、メール確認を行いたいです。
Laravel 5.7 を使用しています。
認証メールが送信されず困っています。またセキュリティ等に問題があれば、ご指摘頂きたいです。
登録したメールアドレス宛に送られた認証リンクを踏んで、仮登録から本登録にする機能です。
以下、考えた流れです。(4)(5)はイベント経由で処理します。
変更時の処理の流れ
(1) フォームからパスワードと新メールアドレスをPOST(パスワードが正しければ処理)
(2) usersテーブルの email_verified_at カラムを null にする(仮登録状態に)
(3) usersテーブルの email カラムを変更し保存
(4) 新メールアドレス宛に確認メールを送信(登録時のメール確認と同じ処理)
(5) 旧メールアドレスに変更を通知
リスナのhandleメソッドは、以下を参考にしました。Illuminate/Auth/Listeners/SendEmailVerificationNotification
SendEmailVerificationNotification.php
問題点
新メールアドレス宛に確認メールが送信されない。
フォームがPOSTされた際のアクション
PHP
1public function change_email(Request $request) 2{ 3 /** 4 * バリデーションなど 5 */ 6 $user = $request->user() 7 8 DB::transaction(function () use($user, $request){ 9 //現在のメールアドレス 10 $registered_email = $user->email; 11 //新しいメールアドレスがPOSTされたら 12 if($registered_email !== $request->input('email')){ 13 //仮登録状態にする 14 $user->email_verified_at = null; 15 $user->email = $request->input('email'); 16 $user->save(); 17 //メールアドレス変更イベントを発火 18 event(new ChangeEmailEvent($user, $registered_email)); 19 } 20 }); 21 return redirect('/'); 22}
イベント
PHP
1class ChangeEmailEvent 2{ 3 /** 4 * 一部省略 5 */ 6 public $user; 7 public $registered_email; 8 9 public function __construct(User $user, string $registered_email) 10 { 11 $this->user = $user; 12 $this->registered_email = $registered_email; 13 } 14}
リスナ
PHP
1class ChangeEmailListener 2{ 3 /** 4 * 一部省略 5 */ 6 public function handle(ChangeEmailEvent $event) 7 { 8 //新メールアドレスにメール確認(ここが問題) 9 if ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail()) { 10 $event->user->sendEmailVerificationNotification(); 11 } 12 //旧メールアドレスに変更を通知 13 \Mail::to($event->registered_email)->send(new ChangeMail($event->user)); 14 } 15}
旧メールアドレスへの送信は成功しているので、イベントリスナは正常に動作しているはずです。
確認メールの生成送信に、登録時と同じロジックは使えないのでしょうか。
解決策を教えていただけますでしょうか。またその他問題点があればご指摘ください。
以上です。ご回答よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/02 16:18