Laravel 8.x パスワードリセット

イントロダクション

大抵のWebアプリケーションはパスワードをリセットする手段を提供しています。それぞれのアプリケーションで何度も実装する代わりに、Laravelはパスワードリマインダを送り、パスワードリセットを実行する便利な方法を提供しています。

Tip!! さっそく始めたいですか? Laravel Jetstream和訳)を真新しいLaravelアプリケーションにインストールしてください。データベースをマイグレートしたら、ブラウザでアプリケーションの/register、もしくはアプリケーションに割り付けた他のURLに移動します。Jetstreamはパスワードのリセットを含め、認証システム全体のスカフォールドを受け持ちます。

モデルの検討事項

Laravelのパスワードリセット機能を使用する前に、App\Models\UserモデルでIlluminate\Notifications\Notifiableトレイトを使用する必要があります。通常このトレイトは、Laravelに含まれているデフォルトのApp\Models\Userモデルに最初から含まれています。

モデルが、Illuminate\Contracts\Auth\CanResetPassword契約を実装していることを確認します。フレームワークに含まれているApp\Models\Userモデルははじめからこのインターフェイスを実装しており、インターフェイスの実装に必要なメソッドを取り込むためにIlluminate\Auth\Passwords\CanResetPasswordトレイトを使用しています。

データベースの検討事項

アプリケーションのパスワードリセットトークンを保存するためのテーブルを作成する必要があります。このテーブルのマイグレーションは、デフォルトのLaravelインストールに含まれているため、データベースマイグレーションを実行してこのテーブルを作成するだけです。

php artisan migrate

ルート定義

ユーザーがパスワードをリセットできるようにするためのサポートを適切に実装するには、ルートを2つ定義する必要があります。まず、ユーザーが自分のメールアドレスを介してパスワードリセットリンクをリクエストできるようにするためのルートです。2つ目はユーザーが電子メールで送信されたパスワードリセットリンクにアクセスしたら、実際にパスワードをリセットするためのルートが必要です。

パスワードリセットリンクの要求

パスワードリセットリンク要求フォーム

最初に、パスワードリセットリンクを要求するために必要なルートを定義します。そのために、パスワードリセットリンクリクエストフォームを含むビューを返すルートを定義します。

Route::get('/forgot-password', function () {
    return view('auth.forgot-password');
})->middleware(['guest'])->name('password.request');

このルートによって返されるビューには、 emailフィールドを含むフォームが必要です。これにより、ユーザーは特定のメールアドレスのパスワードリセットリンクをリクエストできます。

フォーム送信の処理

次に、「パスワードを忘れた」ビューからのフォーム要求を処理するルートを定義します。このルートは、電子メールアドレスを検証し、該当するユーザーへパスワードリセットリクエストを送る責務を負います。

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;

Route::post('/forgot-password', function (Request $request) {
    $request->validate(['email' => 'required|email']);

    $status = Password::sendResetLink(
        $request->only('email')
    );

    return $status === Password::RESET_LINK_SENT
                ? back()->with(['status' => __($status)])
                : back()->withErrors(['email' => __($status)]);
})->middleware(['guest'])->name('password.email');

先へ進む前に、このルートの詳細を確認しましょう。まず、リクエストの email属性が検証されます。 次に、Laravelの組み込みの(Passwordファサードによる)「パスワードブローカ」を使用し、パスワードリセットリンクをユーザーに送信します。パスワードブローカーは、指定されたフィールド(この場合はメールアドレス)でユーザーを取得し、Laravelの組み込み通知システムを介してパスワードリセットリンクをユーザーに送ります。

sendResetLinkメソッドは「ステータス」スラッグを返します。このステータスはリクエストのステータスに関するユーザーフレンドリーなメッセージを翻訳して表示するために、Laravelの多言語化ヘルパを使用します。パスワードリセットステータスの翻訳は、アプリケーションの resources/lang/{lang}/passwords.php言語ファイルにの内容で行われます。ステータススラグの可能な各値のエントリは、passwords言語ファイル内にあります。

Tip!! パスワードのリセットを自前で実装する場合は、ビューのコンテンツとルートを自分で定義する必要があります。必要なすべての認証および検証ロジックを含むスカフォールドが必要な場合は、Laravel Jetstream和訳)をチェックしてください。

パスワードリセット

パスワードリセットフォーム

次に、ユーザーがメールで送られてきたパスワードリセットリンクをクリックして、新しいパスワードを入力し実際にパスワードをリセットするのに必要なルートを定義します。まず、ユーザーがパスワード再設定リンクをクリックしたときに表示されるパスワード再設定フォームを表示するルートを定義しましょう。このルートは後でパスワードリセットリクエストを確認するために使用する tokenパラメーターを受け取ります。

Route::get('/reset-password/{token}', function ($token) {
    return view('auth.reset-password', ['token' => $token]);
})->middleware(['guest'])->name('password.reset');

このルートによって返されるビューには、 emailフィールド、passwordフィールド、password_confirmationフィールド、および非表示でルートが受け取るシークレットトークンの値を含むtokenフィールドを持つフォームが必要です。

フォーム送信の処理

もちろん、パスワードリセットフォームの送信内容を実際に処理するためのルートを定義する必要があります。このルートは、受信リクエストの検証とデータベース内のユーザーのパスワードの更新の責務を負います。

use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;

Route::post('/reset-password', function (Request $request) {
    $request->validate([
        'token' => 'required',
        'email' => 'required|email',
        'password' => 'required|min:8|confirmed',
    ]);

    $status = Password::reset(
        $request->only('email', 'password', 'password_confirmation', 'token'),
        function ($user, $password) use ($request) {
            $user->forceFill([
                'password' => Hash::make($password)
            ])->save();

            $user->setRememberToken(Str::random(60));

            event(new PasswordReset($user));
        }
    );

    return $status == Password::PASSWORD_RESET
                ? redirect()->route('login')->with('status', __($status))
                : back()->withErrors(['email' => __($status)]);
})->middleware(['guest'])->name('password.update');

先へ進む前に、このルートをさらに詳しく見てみましょう。まず、リクエストのtokenemailpassword属性が検証されます。 次に、Laravel組み込みの(Passwordファサードによる)「パスワードブローカー」を使用し、パスワードリセットリクエストの認証情報を検証します。

パスワードブローカーに提供されたトークン、メールアドレス、パスワードが有効な場合、resetメソッドに渡されたクロージャが実行されます。ユーザーインスタンスと平文テキストパスワードを受け取るこのクロージャ内で、データベース上のユーザーパスワードを更新します。

resetメソッドは「ステータス」スラグを返します。このステータスは、リクエストのステータスに関してユーザーにわかりやすいメッセージを翻訳し表示するために、Laravelの多言語化ヘルパを使用します。パスワードリセットステータスの翻訳内容は、アプリケーションのresources/lang/{lang}/passwords.php言語ファイル内にあります。ステータススラグの指定可能な各値のエントリは、passwords言語ファイル内にあります。

カスタマイズ

リセットメールのカスタマイズ

パスワードリセットリンクをユーザーへ送るために使用する、通知クラスは簡単に変更できます。手始めに、UserモデルのsendPasswordResetNotificationメソッドをオーバーライドしましょう。このメソッドの中で、皆さんが選んだ通知クラスを使用し、通知を送信できます。パスワードリセット$tokenは、メソッドの第1引数として受け取ります。

/**
 * パスワードリセット通知の送信
 *
 * @param  string  $token
 * @return void
 */
public function sendPasswordResetNotification($token)
{
    $this->notify(new ResetPasswordNotification($token));
}

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる