初めてのLaravel 5.1 : (29) パスワード再設定

reset_password

前回は、ユーザー登録とログイン認証を実装しました。今回はパスワードの再設定を実装します。この処理はパスワードを忘れてしまって、ログイン出来なくなってしまった時に、メールを送信してパスワードの再設定を行える機能です。


メールテスト環境

事前に、メールの環境設定を行っておきます。
ローカルな開発環境のみでテストする場合は、MailCatcherを使うと便利です。


Routing

routes.phpに以下のようにルートを追加します。

<?php // app/Http/routes.php

...

// Password reset link request routes...
Route::get('password/email', 'Auth\PasswordController@getEmail');
Route::post('password/email', 'Auth\PasswordController@postEmail');

// Password reset routes...
Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');
Route::post('password/reset', 'Auth\PasswordController@postReset');

// Route::controller('password', 'Auth\PasswordController'); // ①

4つのルートを追加しました。
上記の4つを登録する代わりに①の Implicit Controller(暗黙コントローラ)を使うこともできます。

artisan コマンドでルートを確認します。

php artisan route:list
+--------+----------+--------------------------+------------------+--------------------------------------------------------+------------+
| Domain | Method   | URI                      | Name             | Action                                                 | Middleware |
+--------+----------+--------------------------+------------------+--------------------------------------------------------+------------+
|        | GET|HEAD | password/email           |                  | App\Http\Controllers\Auth\PasswordController@getEmail  | guest      |
|        | POST     | password/email           |                  | App\Http\Controllers\Auth\PasswordController@postEmail | guest      |
|        | GET|HEAD | password/reset/{token}   |                  | App\Http\Controllers\Auth\PasswordController@getReset  | guest      |
|        | POST     | password/reset           |                  | App\Http\Controllers\Auth\PasswordController@postReset | guest      |
+--------+----------+--------------------------+------------------+--------------------------------------------------------+------------+

※上記の表は password に絞って表示しています。


View

パスワード再設定のビューを以下のように作成します。

resources/
└── views
    ├── auth
    │   ├── password.blade.php パスワード再設定メール送信
    │   └── reset.blade.php パスワード再設定
    └── emails
         └── password.blade.php パスワード再設定メール

auth/password.blade.php

{{-- resources/views/auth/password.blade.php --}}

@extends('layout')

@section('content')
<div class="container-fluid">
  <div class="row">
    <div class="col-md-8 col-md-offset-2">
      <div class="panel panel-default">
        <div class="panel-heading">Reset Password</div>
        <div class="panel-body">
          @if (session('status'))
            <div class="alert alert-success">
              {{ session('status') }}
            </div>
          @endif

          @if (count($errors) > 0)
            <div class="alert alert-danger">
              <strong>Whoops!</strong> There were some problems with your input.<br><br>
              <ul>
                @foreach ($errors->all() as $error)
                  <li>{{ $error }}</li>
                @endforeach
              </ul>
            </div>
          @endif

          <form class="form-horizontal" role="form" method="POST" action="/password/email">
            <input type="hidden" name="_token" value="{{ csrf_token() }}">

            <div class="form-group">
              <label class="col-md-4 control-label">E-Mail Address</label>
              <div class="col-md-6">
                <input type="email" class="form-control" name="email" value="{{ old('email') }}">
              </div>
            </div>

            <div class="form-group">
              <div class="col-md-6 col-md-offset-4">
                <button type="submit" class="btn btn-primary">
                  Send Password Reset Link
                </button>
              </div>
            </div>
          </form>
        </div><!-- .panel-body -->
      </div><!-- .panel -->
    </div><!-- .col -->
  </div><!-- .row -->
</div><!-- .container-fluid -->
@endsection

auth/reset.blade.php

{{-- resources/views/auth/reset.blade.php --}}

@extends('layout')

@section('content')
<div class="container-fluid">
  <div class="row">
    <div class="col-md-8 col-md-offset-2">
      <div class="panel panel-default">
        <div class="panel-heading">Reset Password</div>
        <div class="panel-body">
          @if (count($errors) > 0)
            <div class="alert alert-danger">
              <strong>Whoops!</strong> There were some problems with your input.<br><br>
              <ul>
                @foreach ($errors->all() as $error)
                  <li>{{ $error }}</li>
                @endforeach
              </ul>
            </div>
          @endif

          <form class="form-horizontal" role="form" method="POST" action="/password/reset">
            <input type="hidden" name="_token" value="{{ csrf_token() }}">
            <input type="hidden" name="token" value="{{ $token }}">

            <div class="form-group">
              <label class="col-md-4 control-label">E-Mail Address</label>
              <div class="col-md-6">
                <input type="email" class="form-control" name="email" value="{{ old('email') }}">
              </div>
            </div>

            <div class="form-group">
              <label class="col-md-4 control-label">Password</label>
              <div class="col-md-6">
                <input type="password" class="form-control" name="password">
              </div>
            </div>

            <div class="form-group">
              <label class="col-md-4 control-label">Confirm Password</label>
              <div class="col-md-6">
                <input type="password" class="form-control" name="password_confirmation">
              </div>
            </div>

            <div class="form-group">
              <div class="col-md-6 col-md-offset-4">
                <button type="submit" class="btn btn-primary">
                  Reset Password
                </button>
              </div>
            </div>
          </form>
        </div><!-- panel-body -->
      </div><!-- .panel -->
    </div><!-- .col -->
  </div><!-- .row -->
</div><!-- .container-fluid -->
@endsection

emails/password.blade.php

{{-- resources/views/emails/password.blade.php --}}

Click here to reset your password: {{ url('password/reset/'.$token) }}

Controller

PasswordController.php を修正し、パスワード再設定後のリダイレクト先を指定します。リダイレクト先を指定しなかった場合は、”/home”へリダイレクトするように、ResetsPasswords トレイトの中で、ハードコーディングされています。ResetsPasswords トレイトの中身はざっと目を通しておくことをお薦めします。

// app/Http/Controllers/Auth/PasswordController.php

class PasswordController extends Controller {
	use ResetsPasswords;

	protected $redirectTo = '/articles';	// パスワード再設定後のリダイレクト先

	...

パスワード再設定

実際にパスワードの再設定を行ってみます。

reset_password

  1. ログインしている場合は、ログアウトします。
  2. ログイン画面を表示します。
  3. “Login” ボタンの右にある “Forget Your Password?” をクリックすると、”Reset Password”画面が表示されます。
  4. 登録済のメールアドレスを入力して、”Send Password Rest Link”ボタンをクリックします。
  5. 少しするとメールが届くので、メール内のURLにWWWブラウザでアクセスします。
  6. “Reset Password” 画面が現れるので、登録済メールアドレスと、新しいパスワードを入力して、”Reset Password”ボタンをクリックします。
  7. 記事一覧が表示され、ナビゲーションの右上にユーザー名が表示されます。
  8. 念のため、一旦ログアウトして、新しいパスワードでログインできるかも確認します。

まとめ

パスワードの再設定ができるようになりました。
パスワード再設定用のコントローラが初めから入っているのは良いのですが、ルーティング、ビューの作成を行わなければならず、ちょっと分かりづらかったです。この辺の手順の事は公式サイトのドキュメントに記述されていますので、そちらもチェックして置くことをお薦めします。

http://laravel.com/docs/5.1/authentication#resetting-passwords

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中