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を利用してるので、だめですね。
<img width="686" alt="スクリーンショット 2020-04-02 0.03.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596140/36afa1f5-0413-a624-5836-c8b4e2c9311e.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のパスワードリセットメールを日本語にする](https://saba.omnioo.com/note/3155/laravel5%E3%81%AE%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AB%E3%81%99%E3%82%8B/))
英語なので日本語に編集してもいいのですが、原本であるので、あまり触らない方がいいそうです。
メール送信の方法は他にもあるそうなので、(make:notificationとか)随時勉強していきます。
ありがとうございました。