ここではユーザがパスワードを忘れた場合に自分でリセットできるようにしよう.
実は,メール送信機能を設定し,ユーザ認証機能を php artisan make:auth
で追加した段階で,パスワードリセットの機能もほぼ実装されている.
ログインページを表示し,「Forgot Your Password?」リンクをクリックする.
登録済みで受信可能なメールアドレスを入力して「Send Password Reset Link」ボタンをクリックする.
メールの送信ができたら,次のような画面が表示されるはず.
実際にメールを受信する.「Reset Password」ボタンをクリックするかメール本文下部のリンクをクリックする.
リセットページを開けない.原因はURLが [rin06.ba・・・] ではなく,[localhost] になっているためである.
よって,URLの「localhost/・・・」を「rin06.ba.kobegakuin.ac.jp:8000/・・・」のように書き換えてみると接続できる(ここでは林坂の仮想開発環境 [192.168.33.100:8000/・・・] になっています.).メールアドレスと新しいパスワードを入力して「Reset Password」をクリックする.
パスワードがリセットされて次のような画面が表示された.
リセットしたパスワードを使ってログインができました.
以上のとおり必要な機能はほぼ実装されており,メールのリンクがおかしいだけである.この問題を解決しよう.
アプリケーションの主な設定情報は .env に記述される.この .env の APP_URL
を書き換えるだけで良い.また,APP_NAME
にアプリケーションの名称を記述しておけば,メールの本文などで利用される.ここも適当な名称に書き換えておこう.
.env (抜粋)
APP_NAME="Laravelユーザ管理システム"
APP_ENV=local
APP_KEY=base64:1ylSjkK2uEeMaHL6azIHRJRhKeMjsm7N39A60YoGsn4=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://rin06.ba.kobegakuin.ac.jp:8385
.env を編集したので,webサーバを再起動する.再起動後,パスワードリセットのリンク送信をしてみよう.今度は正しいリンクが送信されているはずである.なお,.env は git の管理に含まれていない.よって,この変更は .env.example にも反映しておくと良い..env.example は git に含まれているので変更が記録される(ただし,パスワードは保存しないようにしよう).
パスワードリセットの情報は pssword_resets テーブルに保存される.実際に sqlite で内容を確認してみよう. password_resets テーブルの内容を,「Send Password Reset Link」ボタンを押す前,ボタンを押してメールが送信された後,メールを受信して実際にパスワードをリセットした後で確認すると次のようになる.つまり,メールを送信してまだリセットされていない状態だけ password_resets に情報が保存される.
[GakuinHana@rin06 laravelUser]$ sqlite3 database/database.sqlite ⏎ SQLite version 3.6.20 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables ⏎ failed_jobs migrations users jobs password_resets sqlite> select * from password_resets; ⏎ # 「Send Password Reset Link」ボタンを押す前 sqlite> select * from password_resets; ⏎ # ボタンを押してメールが送信された後 rinsaka@samle.com|$2y$10$cyfm46d6ZQHX5hgVoMM4NuVqOVG6ZXQXN76XZE7cVg0yLeDGToNJ.|2018-07-04 08:39:06 sqlite> select * from password_resets; ⏎ # パスワードをリセットした後 sqlite> .exit ⏎ [GakuinHana@rin06 laravelUser]$
パスワードリセットのメールに記述されたリンクの有効期限は標準で60分である.この設定は config/auth.php に次の通り記述されている.必要に応じてこの値を変更すれば良い.
config/auth.php (抜粋)
/*
|--------------------------------------------------------------------------
| Resetting Passwords
|--------------------------------------------------------------------------
|
| You may specify multiple password reset configurations if you have more
| than one user table or model in the application and you want to have
| separate password reset settings based on the specific user types.
|
| The expire time is the number of minutes that the reset token should be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
*/
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
],
メール送信後,1時間以上経過してリセットしようとすると,次のようなエラーが表示される.この場合,再度リセットのメールを送信すれば良い.