k.watanabe技術者ブログ

k.watanabe

laravel breezeで会員登録とログインとメール認証

はじめに

 今回はlarval breezeを使用して会員登録とログイン機能を実装してみました。larval breezeとはログイン機能やメール認証、パスワードを忘れた場合などの認証周りに必要な機能が用意されたパッケージです。デフォルトの状態でそれらの機能が備わっているので必要に応じてカスタマイズするだけで実装出来ます。

手順1: モデルクラスの編集

デフォルトの状態では以下のコードがコメントアウトされてメール認証が無効になっているため、コメントアウトを外して有効にします。


App/Models/User.php

  1. use Illuminate\Contracts\Auth\MustVerifyEmail;

さらに implements  MustVerifyEmailを追加します。

  1. class User extends Authenticatable implements MustVerifyEmail

手順2:バリデーションの確認

デフォルトの状態からバリデーションも実装されています。


Bladeファイルにhtmlの必須チェックが入っているので、それを削除してバリデーションメッセージが表示されることを確認します


postman5

確認用パスワードのチェックがなかったので追加しました。

RegisteredUserController.php

  1. /**
  2.      * Handle an incoming registration request.
  3.      *
  4.      * @throws \Illuminate\Validation\ValidationException
  5.      */
  6.     public function store(Request $request): RedirectResponse
  7.     {
  8.         $request->validate([
  9.             'name' => ['required', 'string', 'max:255'],
  10.             'email' => ['required', 'string', 'email', 'max:255', 'unique:'.User::class],
  11.             'password' => ['required', 'confirmed', Rules\Password::defaults()],
  12.             'password_confirmation' => ['required', Rules\Password::defaults()],
  13.         ]);

エラーメッセージも日本語で表示するようにします。

Resources/lang/ja/validation.php

  1.     'attributes' => [
  2.         'name' => '氏名',
  3.         'email' => 'メールアドレス',
  4.         'title' => '件名',
  5.         'message' => '本文',
  6.         'password' => 'パスワード',
  7.         'password_confirmation' => '確認用パスワード'
  8.     ],

手順3: ユーザー登録

ユーザー登録も初めからusersテーブルとUserモデルクラスが用意され、バリデーションが通ると登録されるロジックが実装されています。


RegisteredUserController.php

  1.  public function store(Request $request): RedirectResponse
  2.     {
  3.         $request->validate([
  4.             'name' => ['required', 'string', 'max:255'],
  5.             'email' => ['required', 'string', 'email', 'max:255', 'unique:'.User::class],
  6.             'password' => ['required', 'confirmed', Rules\Password::defaults()],
  7.             'password_confirmation' => ['required', Rules\Password::defaults()],
  8.         ]);
  9.         $user = User::create([
  10.             'name' => $request->name,
  11.             'email' => $request->email,
  12.             'password' => Hash::make($request->password),
  13.         ]);
  14.         event(new Registered($user));
  15.         Auth::login($user);
  16.         return redirect(RouteServiceProvider::HOME);
  17.     }

バリデーションが通った後にusersテーブルに登録されているのが確認出来ました。

users

メール認証の文章は適宜日本語に訳しました。テンプレートも最初から用意されています。

mail_send

メールからURLをクリックすると認証され、ログイン状態になってマイページに遷移する所まで確認出来ました。

mypage

その他1: ログイン認証のセキュリティ対策

Breezeではセキュリティ対策として認証で何度も失敗した場合は一定時間ロックされ、すぐにログイン出来なくなるように設定されています。これはブルートフォースアタックなどを防ぐためです。


mypage

デフォルトでは5回失敗した場合はすぐにログイン出来なくなるように設定されています。回数を変更したい場合は、【tooManyAttempts】に指定されている引数の5を変更します。

HTTP/Requests/Auth/LoginRequest.php

  1.     /**
  2.      * Ensure the login request is not rate limited.
  3.      *
  4.      * @throws \Illuminate\Validation\ValidationException
  5.      */
  6.     public function ensureIsNotRateLimited(): void
  7.     {
  8.         if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
  9.             return;
  10.         }

デフォルトでは1分間ロックされるように設定されています。


例えば5分間ロックされるようにしたい場合は、RateLimiter::hitの第二引数に秒単位で指定します。5分は300秒なので300を追加しました。

  1. /**
  2.      * Attempt to authenticate the request's credentials.
  3.      *
  4.      * @throws \Illuminate\Validation\ValidationException
  5.      */
  6.     public function authenticate(): void
  7.     {
  8.         $this->ensureIsNotRateLimited();
  9.         if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
  10.             RateLimiter::hit($this->throttleKey(),300);
  11.             throw ValidationException::withMessages([
  12.                 'email' => trans('auth.failed'),
  13.             ]);
  14.         }
  15.         RateLimiter::clear($this->throttleKey());
  16.     }

300秒後に設定が変更出来ました。

login3

あとは登録されていないアカウントでログインをした場合のバリデーションも最初から実装された状態になっています。

login

まとめ

このようにlaravelのbreezeではほとんどこちらで実装することなく、ログイン、会員登録、メール認証の機能が動くことを確認出来ました。


デフォルトの状態でこれだけの機能が揃っているので非常に便利です。あとは必要に応じて会員登録の項目やバリデーションの追加など適宜カスタマイズして行こうと思います。


記事一覧に戻る

プロフィールに戻る