laravel5.5でパスワードリセットのやり方
laravelのパスワードリセットは、標準のユーザ認証に最初から実装されている(英語だけど)
パスワードリセットの基本的な流れは以下の通り
1, 以下のURLにアクセスして、既存Userのメールアドレスを入力する
http://laravel55/password/reset
2, こんな感じのメールが来るので、ボタンを押してパスワードリセット画面へ飛ぶ
※日本語化しようとしたら、vendorフォルダ以下にemailテンプレートがあって面倒だった。
3, パスワードリセット画面には、email, 新しいパスワード(&確認用パスワード)がある。
自分のメールアドレス以外はエラーとなる(トークン+メアドでセキュリティを高めている。トークン総当たり対策?)
4, 問題がなければパスワードが上書きされ、ログイン状態でトップページ(/home)にリダイレクトされる
※パスワードリセット系のメッセージを日本語化するには、resources/lang/ja/validate.phpではなく、passwords.phpを生成する
https://readouble.com/laravel/5.5/ja/passwords-php.html
routes/web.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// laravel_project直下で良ければ、この1行でOK Auth::routes(); // laravel_project/sectionみたいにルート直下以外なら、自分でルーティングを書く(こっちの方が何をやっているか分かりやすい) Route::group(['prefix' => 'section'], function() { Route::get('register', 'Auth\LoginController@showRegisterForm')->name('register'); Route::post('register', 'Auth\RegisterController@register'); // パスワードリセットのためのemail入力 Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request'); // トークンURLが書かれたメール送信 Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email'); // トークンURLから新規パスワード入力画面 Route::get('password/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset'); // 実際のパスワード上書き処理 Route::post('password/reset', 'Auth\ResetPasswordController@reset'); }); |
日本語化
まず、一番気になるのは、URL付きメールの日本語化だよな。
メールテンプレートがどこにあるのか調べてみたら、外出しされていなかった。
vendor/laravel/framework/src/Illuminate/Notifications/resources/views/email.blade.php
ここを直接修正すると、update時に消えるのでダメ~。
既存クラスを継承して、独自クラスを作るか~と思って調べてたら、もっと楽な方法があった(laravel5.3以降)
vendorフォルダ以下のテンプレートファイル(選択式)を、resources/views/vendorフォルダにコピーすると、優先的にそちらが使われるらしい。
https://qiita.com/honeytrap15/items/09a6f68a077fad34658e
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
### 選択式か ### php artisan vendor:publish Which provider or tag's files would you like to publish?: [0] Publish files from all providers and tags listed below [1] Provider: Fideloper\Proxy\TrustedProxyServiceProvider [2] Provider: Illuminate\Mail\MailServiceProvider [3] Provider: Illuminate\Notifications\NotificationServiceProvider [4] Provider: Illuminate\Pagination\PaginationServiceProvider [5] Tag: laravel-mail [6] Tag: laravel-notifications [7] Tag: laravel-pagination ### オプションで直接指定してもOK ### php artisan vendor:publish --tag=laravel-notifications Copied Directory [\vendor\laravel\framework\src\Illuminate\Notifications\resources\views] To [\resources\views\vendor\notifications] Publishing complete. |
こんな感じで、超シンプルにする
resources/views/vendor/notifications/email.blade.php
1 2 |
以下のURLをクリックして、新しいパスワードを入力して下さい。 <a href="{{ $actionUrl }}">{{ $actionUrl }}</a> |
でも、これだと
送信元=Example
件名=Reset Password
のままなので、処理している所を探したら、またvendorフォルダやん・・・。
vendor\laravel\framework\src\Illuminate\Auth\Notifications\ResetPassword.php
1 2 3 4 5 6 7 |
public function toMail($notifiable) { return (new MailMessage) ->line('You are receiving this email because we received a password reset request for your account.') ->action('Reset Password', url(config('app.url').route('password.reset', $this->token, false))) ->line('If you did not request a password reset, no further action is required.'); } |
結局、独自通知クラスを作らないとダメっぽいので、諦めて作ろう。
Laravel5のパスワードリセットメールを日本語にする
1, 通知クラスを作る
1 |
php artisan make:notification JaPasswordReset |
2, app/User.phpで、パスワードリセット通知クラスを変更する
1 2 3 4 5 6 7 8 9 |
// 日本語のパスワードリセットメール use App\Notifications\JaPasswordReset; // オーバーライド // パスワードリセットのメールタイトルと送信者を日本語に変更する public function sendPasswordResetNotification($token) { $this->notify(new JaPasswordReset($token)); } |
3, 目的のメールタイトルと送信元を日本語化
App\Notifications\JaPasswordReset;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public function toMail($notifiable) { return (new MailMessage) ->subject(__('パスワードリセットの準備ができました')) ->from(config('mail.from.address')) ->view('vendor.notifications.email') ->action(__('パスワードリセット'), url('password/reset', $this->token)); /* 日本語化するのでコメントアウト ->line('The introduction to the notification.') ->action('Notification Action', url('/')) ->line('Thank you for using our application!'); */ } |
fromだけなら、config/mail.phpとか.envファイルがデフォルト値で良いのだが、メールタイトルだけは個別だからな…。
mailableクラスも便利なようで微妙だな。
あとは、以下の画像にあった2ファイルを、ちまちま日本語化すればOK!
resources/views/passwords/email.blade.php(メアド入力)
resources/views/passwords/reset.blade.php(確認メアド・新規パスワード入力)