BackEnd

Laravel Authのパスワードリセット機能をカスタマイズする

投稿日:

はじめに

こんにちは。Laravelには標準の認証機能Authが用意されており、その中にはパスワードリセット機能が最初から含まれています。 メールアドレスを入力するとメールが送信され、メール本文内のURLにアクセスしてパスワードを再設定できるという、様々なサイトにある機能です。

今回はこのパスワードリセット機能を一部カスタマイズすることで、Laravelの認証機能のカスタマイズ方法を追っていきたいと思います。

環境はmacOS High Sierra+Laradockで構築し、LaravelのバージョンはLTS版の最新である5.5を使用します。また、Docker本体のインストール完了、およびLaradockで環境構築しWelcomeページが表示できていることが前提となります。

準備

Auth

ログイン画面等のviewは、Laravel標準で提供されている auth を利用します。PHPが動作しているコンテナにログインし、 artisan コマンドを実行することで自動生成できます。

mailhog

mailhogは簡易SMTPサーバの一種で、mailhogに対してPHPやRubyなどからメール送信処理を実行することで、実際のアドレスに送信することなく、メールの内容を確認することができます。 mailhogのコンテナはLaradockに含まれており、build&upで簡単に立ち上げることができます。

立ち上げた後は localhost:8025 にアクセスすると、mailhogに送信したメールをブラウザから確認できます。なお、mailhogの設定はdocker-compose.ymlに記述されており、デフォルトでは下記のようになっています。 この場合、1025番ポートでメールを待ち受けており、8025番ポートでブラウザからのアクセスを待ち受けているという意味になります。

続いてLaravelのメール送信設定を変更します。Laravelプロジェクトのトップディレクトリにある .env を編集し、デフォルトから以下のように変更します。

これでLaravelから送信されるメールをmailhogでキャッチし、実際にメールアドレスに送信することなくメール内容を確認できるようになりました。

ユーザー登録とログイン

localhost/register にアクセスすると登録フォームが表示されます。 任意のアカウント名・メールアドレス・パスワードを入れて登録を行い、ログイン完了した旨が表示されたら、画面右上のリンクからログアウトしましょう。

パスワードリセットのカスタマイズ

http://localhost/login で「Forgot Your Password?」をクリックすると、メールアドレス入力画面が表示されます。 デフォルトではここで入力したメールアドレスにパスワードリセット用のURLが送信されますが、今回はアカウント名でリセットを行うようにカスタマイズしてみます。

ルーティング確認

「どのURLにアクセスしたらどのアクションメソッドが呼ばれるか」を確認するにはいくつか方法がありますが、ここでは artisan コマンドを使います。

メールアドレス入力画面のURLはpassword/resetですので、対応しているのは下記の行となります。

GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm

ところが ForgotPasswordController を開いてみると showLinkRequestForm は存在せず、実際の処理は SendsPasswordResetEmails のshowLinkRequestFormで行われています。 これで auth/passwords/email.blade.php を呼び出しているのが分かりました。viewのファイル名を変えたり、viewを呼び出す以外の処理を行いたい場合は ForgotPasswordController クラスで showLinkRequestForm をオーバーライドすることでカスタマイズが可能です。

view編集

auth/passwords/email.blade.php を以下のように編集し、メールアドレスではなくアカウント名を入れるようにします。

認証処理の編集

viewの編集が完了したら、ユーザー登録したときのアカウント名を入力して「Send Password Reset Link」を…と言いたいところですが、本来はメールアドレスの入力を想定した機能ですので、アカウント名を入力しても動作せず、エラー扱いになってしまいます。認証部分の処理もカスタマイズしましょう。

auth/passwords/email.blade.php のform要素を見ると、送信先は password/email が指定されています。

先述の php artisan route:list で該当するのは以下の行です。

POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail

ここでも ForgotPasswordController に該当のメソッドは存在せず、実体は SendsPasswordResetEmails に実装されています。

今回はこれらのメソッドを ForgotPasswordController クラスの中でオーバーライドして、下記のように実装します。

ここまで完了したら http://localhost/password/reset でアカウント名を入力し「Send Password Reset Link」ボタンを押しましょう。 成功すれば「We have e-mailed your password reset link!」と表示されて、登録時に入力したメールアドレスにメールが送信…は実際には行われません。 localhost:8025 にアクセスすると、webメールサービスの受信画面のようなページが表示され、ここで送信内容が確認できます。

以下2つは前述の mailhog の一覧・詳細画面です。通常のSMTPサーバであればLaravelからメールアドレス宛に送信が行われますが、 mailhog がメールをキャッチし、外部への送信を行わずSMTPサーバ内に留めて、このように表示しています。

リセット画面

メールに表示されている「Reset Password」のリンクにアクセスすると、新しいパスワードを入力する画面が表示されます。ここでのルーティング情報は下記のとおりです。

GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm

今までと同じく ResetPasswordControllershowResetForm メソッドは無く、実装は ResetsPasswords で行われています。

このメソッドをカスタマイズする際も、先ほどの sendResetLinkEmail と同パターンで、ここでは ResetPasswordController でオーバーライドすることになります。 実際のリセット処理や、リセット完了後のページ転送処理も ResetsPasswords に実装されており、それぞれカスタマイズが可能です。

さいごに

いかがでしたでしょうか。1機能の条件をひとつ変えるだけで随分面倒な…と感じるかもしれませんが、実装方法を細かく指定することはフレームワーク(枠組み)の意図するところであり、こうした学習コストと引き換えに、メソッドの命名や処理の遷移が実装者に左右されなくなるというメリットを得られるのだと思います。

おすすめ書籍

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応 PHPフレームワーク Laravel入門 Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Go言語

Goのfmt.print系関数のまとめ

1 はじめに2 print関数の命名規則3 各print関数の説明3.1 Print(標準出力へ出力)系関数3.2 Sprint(文字列を出力)系関数3.3 Fprint(ファイルへ出力)系関数4 書 ...

markdownで書けるドキュメントツールのGitbookを試す

1 はじめに2 Gitbookとは3 nvm4 node.jsインストール5 Gitbook導入5.1 インストール5.2 初期化5.3 ローカルでブラウザから確認6 作成と編集6.1 見出し編集7 ...

GraphQL

いまさら学ぶGraphQL〜概要編〜

1 はじめに2 GraphQLとは?2.1 なぜGraphQLは誕生した?2.1.1 過剰な取得2.1.2 過少な取得2.1.3 エンドポイントの管理3 GraphQLのメリットとデメリット3.1 G ...

rails

Active Strageを使用してユーザーのアバターを登録、表示する

1 はじめに1.1 環境2 セットアップ2.1 前準備2.2 マイグレーションファイル作成2.3 設定ファイル3 実際に使って見る3.1 モデル3.2 コントローラー3.3 ビュー4 個人的メモ4.1 ...

Stripe Connectを使ってCheckoutを利用した継続課金を実装

1 はじめに1.1 Checkoutを使う場合の動線2 決済画面への遷移2.1 マイグレーション2.2 Checkout Sessionの作成3 決済完了後の制御4 おまけ4.1 ローカルでWebho ...

フォロー

blog-page_side_responsive

2018年12月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。