5
8

More than 1 year has passed since last update.

Laravel9でFortifyを使用する

Last updated at Posted at 2022-12-29

はじめに

Laravelの認証ライブラリのFortifyについて、
基本的な設定 + カスタマイズ方法を書いていきたいと思います。

バックエンドのみで使用する想定です。

▼基本的な設定

▼カスタマイズ方法

Fortifyとは

前述のように、Laravel FortifyはLaravelのフロントエンドに依存しない認証バックエンドの実装です。Fortifyは、ログイン、ユーザー登録、パスワードのリセット、メールの検証など、Laravelのすべての認証機能を実装するために必要なルートとコントローラを登録します。

上記は公式ドキュメントからの引用になります。
Laravel UILaravel Breezeのバックエンドの機能のみがある感じですね。
LaravelをAPI化したい場合に選択されるライブラリかと思います。

環境

  • Laravel:9.24.0
  • PHP:8.1

1. インストールする

composer require laravel/fortify

php artisan route:listを実行するとルーティングが追加されていることが確認できます。

2. Fortifyで使用するファイルを作成する

設定に必要なファイルを作成します。

php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider"

上記のコマンドを実行するとマイグレーションファイルも作成されますので、マイグレーションを実行します。

php artisan migrate

3. サービスプロバイダを登録する

config/app.phpprovidersにFortifyのサービスプロバイダを登録します。

app.php
'providers' => [
    // 略
    App\Providers\FortifyServiceProvider::class, // 追加
]

4. 各認証機能のON/OFFを切り替える

config/fortify.phpfeaturesを編集すると各認証機能のON/OFFを切り替えることができます。使用しない機能はコメントアウトします。

fortify.php
'features' => [
    Features::registration(), // ユーザー登録
    Features::resetPasswords(), // パスワードリセット
    Features::emailVerification(), // メールアドレス確認
    // Features::updateProfileInformation(), // 登録情報の更新
    // Features::updatePasswords(), // パスワード更新
    // Features::twoFactorAuthentication([ // 二要素認証
        // 'confirm' => true,
        // 'confirmPassword' => true,
        // 'window' => 0,
    // ]),
],

FortifyJetstreamと組み合わせて使用しない場合は以下の3つのみ有効にすることが推奨されています。

  • ユーザー登録
  • パスワードリセット
  • メールアドレス確認

5. ビュー用のルーティングを無効化する

Fortifyでは元からビュー用のルーティングも定義されていますが、今回はバックエンドのみで使用する想定なので無効化します。

fortify.php
'views' => false,

6. ルーティングのURLにプレフィックスを追加する

何も設定しなければルーティングのURLが/loginのようになっていますが、APIとして使用する際は/api/loginのようにプレフィックスをつけたいことが多いかと思います。そういった場合は下記のようにprefixを設定します。

fortify.php
'prefix' => 'api',

7. 各認証機能のカスタマイズ

機能を細かくカスタマイズしたい場合はapp/Actions/Fortifyにある各ファイルを修正します。
ファイルにはバリデーションや保存処理などが書かれていて、簡単にカスタマイズすることができます。

ファイル名を見ると用途が分かるかと思いますが、一応書いておきます。

  • CreateNewUser.php
    → ユーザー登録用
  • PasswordValidationRules.php
    → パスワードのバリデーションルールが書かれたファイルで、各クラスの中でトレイトで呼ばれています。
  • ResetUserPassword.php
    → パスワードリセット用
  • UpdateUserPassword.php
    → パスワード更新用
  • UpdateUserProfileInformation.php
    → 登録情報の更新用

ちなみに上記の各クラスはFortifyServiceProvider.phpbootメソッド内で読み込まれています。

FortifyServiceProvider.php
public function boot()
{
    Fortify::createUsersUsing(CreateNewUser::class);
    Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class);
    Fortify::updateUserPasswordsUsing(UpdateUserPassword::class);
    Fortify::resetUserPasswordsUsing(ResetUserPassword::class);

    RateLimiter::for('login', function (Request $request) {
        $email = (string) $request->email;

        return Limit::perMinute(5)->by($email.$request->ip());
    });

    RateLimiter::for('two-factor', function (Request $request) {
        return Limit::perMinute(5)->by($request->session()->get('login.id'));
    });
}

8. ルーティングのカスタマイズ

ルーティングのURLを変更したり、ミドルウェアの割り当てを外したいことがあると思います。ルーティングをカスタマイズしたい場合は一旦デフォルトのルーティングを削除して新たにFortify用のルーティングを作成します。

8.1 ルーティングを削除

app/Providers/FortifyServiceProvider.phpを編集します。

FortifyServiceProvider.php
public function register()
    {
        Fortify::ignoreRoutes(); // 追加する
    }

上記のコードを追加するとFortifyのデフォルトのルーティングを全て削除できます。

8.2 新たにFortify用のルーティングファイルを作成する

routesディレクトリ直下にfortify.phpファイルを作成します。

vendor/laravel/fortify/routes/routes.phpのコードをコピーして、作成したfority.phpに貼り付けます。

あとはapp/Providers/RouteServiceProvider.phpにルーティングを登録します。

RouteServiceProvider.php
public function boot()
{
    $this->configureRateLimiting();

    $this->routes(function () {
        Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/api.php'));

        Route::middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));
        // fortifyのルーティングを追加する
        Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/fortify.php'));
    });
}

最後に

ここまで見ていただき、ありがとうございました。
できるだけ間違いがないよう気をつけて書いていますが、何かあれば気軽にご指摘いただければと思います。

参考

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8