LoginSignup
1
4

More than 3 years have passed since last update.

Laravel 5.5 でのパスワードリセット方法

Last updated at Posted at 2020-04-01

Laravel 5.5パスワードリセットの機能を実装するのに結構苦労したので、
メモとして残させてもらいます。
間違ってるところもあると思いますので、何かあればご指摘いただければ嬉しいです。

やりたい事

laravelでパスワードリセット機能を実装する。
パスワード忘れてログインできない!って時に使うやつ。

migrate

php artisan migrate

認証機能

php artisan make:auth

以上で大半の準備が完了です。
必要なコントローラーはapp/http/controllers/auth/
ビューはresources/views/auth/passwords/
ルーティングにも

web.php
Auth::routes()
Route::get('/home', 'HomeController@index')->name('home');

みたいなのが追加されます。

mailableクラス作成

php artisan make:mail ResetPasswordMail

作成されたのはapp/Mail/以下にあります。

パスワードリセットのルーティング本体

vendor/laravel/framework/src/Illuminate/Routing/Router.php
// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');

1131行目ぐらいに書いてます。これをそのまま利用すればmake::auth しなくても良いのかも?

環境設定

.envファイルの中のメール送信設定を変更します。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

laravel/config/mail.php
にドライバの設定がありますが、envファイル変更してたら大丈夫?
メールの送信元を設定できますが、デフォルトでは無いため、直接記述します。
一旦はこんな感じに。

MAIL_FROM_ADDRESS=passreset@laraveltest.com
MAIL_FROM_NAME=Laraveler

あとはこちらのサイト様を思いっきり参考にさせて頂いて、メール設定をしました。
https://www.ritolab.com/entry/38
テスト用メールの中身を確認しながら作成していきます。

メール送信

今回はGmailを使ってみます。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=xxxxxxxxxxx@gmail.com
MAIL_PASSWORD=xxxxxxxxxxxxxxxx
MAIL_ENCRYPTION=tls

MAIL_FROM_ADDRESS=notif@laravelmailsender.com
MAIL_FROM_NAME=LaravelMailSender

この「MAIL_PASSWORD」ですが、実際にGmailを利用してメール送信するなら、アカウントにログインさせた状態にしないといけないって事なので、
・Gmailの2段階認証を設定
・アプリ固有パスワードを取得
・アプリ固有パスワードを上記の「MAIL_PASSWORD」に記述

して設定します。
送信元になるgmailのメールアドレスは見えてしまうので、専用のgmailアカウントを取得するのも手かと思います。

こちらを思いっきり参考にさせていただきました。
https://qiita.com/zaburo/items/37f28f0b621cbac74d15
https://qiita.com/t-kuni/items/aa906cd07e54037a5eaf

あとあまり必要ないかもしれませんが一応。
パスワードリセットが成功した時のリダイレクト先は
Controllers/Auth/ResetPasswordController.php
の中を調整すれば良いとのこと。

メールで送られてきたリンクの調整

Gmailからリンク付きでメールが送信されてきました。
ですが、リンクを踏んだらなぜかlocalhostにアクセスしようとしてる。
現在、某プログラミングスクールでAWSのcloud9を利用してるので、だめですね。
スクリーンショット 2020-04-02 0.03.30.png
先ほどの参考サイト様によると、

ResetPassword.php
        ->action(Lang::getFromJson('Reset Password'), url(config('app.url').route('password.reset', $this->token, false)))
        ->line(Lang::getFromJson('If you did not request a password reset, no further action is required.'));

のところにconfig('app.url')と書いてます。
ここかなぁ・・・ .envファイルの上の方に、

APP_URL=http://localhost

とあります。これを調整すれば良いはず。

やっぱりそうでした。
本番環境に合わせて上記の項目を調整すればパスワードリセットできました。

パスワードリセットメールの本文

やっと見つけましたが、
vendor/laravel/framework/src/Illuminate/Notifications/resources/views/email.blade.php
にメール本文があります。
Laravel5のパスワードリセットメールを日本語にする
英語なので日本語に編集してもいいのですが、原本であるので、あまり触らない方がいいそうです。
メール送信の方法は他にもあるそうなので、(make:notificationとか)随時勉強していきます。

ありがとうございました。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4