Laravel Fortifyとは何なのか(概要,仕組み)

公開:2020/09/20
更新:2020/09/25
5 min読了の目安(約3200字TECH技術記事

Laravel8がリリースされて、Laravel Jetstreamがリリースされましたがその中でLaravel Forifyというパッケージもリリースされました。
こちらについて日本語の記事がほぼ無かったので書きます。

Laravel Fotifyとは

もともとLaravelは5系までは artisan make:auth というコマンドがあり、こちらで基本的な認証のテンプレートが生成される仕組みが生成されるようになっていました。
6系からは laravel/ui というパッケージへこの認証のテンプレートを生成する機能が移動されました。
その後8系になって Laravel Jetstream パッケージが出来て、それに付随するパッケージとして認証をラップした形で Laravel Forify がリリースされました。

Laravel Fotifyの機能

基本となるログイン(Rate Limmiting機能付き)の仕組みにプラスして、以下のFeatureがON/OFFできるようになっています。(config/fortify.php)

  • 登録機能(registration)
  • パスワードリセット機能(resetPasswords)
  • メール認証機能(emailVerification)
  • プロフィール情報の更新機能(updateProfileInformation)
  • パスワードの更新機能(updatePasswords)
  • 2段階認証機能(twoFactorAuthentication)

また、今後の予定としてWebAuthnへの対応がある様子です。

Laravel Fortifyの導入

Laravel ForityはおそらくJetstreamからのインストールが簡単だと思われますが個別で導入することも可能です。

composer require laravel/fortify
php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider"
php artisan migrate

publishすると、configがコピーされる他に、migrationのコピーと基本のstubがapp_pathのActions/Fortifyへコピーされます。
migrateが必要な理由は2段階認証のカラムをusersテーブルに追加するためです。

ただ、Fotifyだけの場合だとフロントエンドのコードは無いので自分で実装する形になります。
Jetstreamがちょうどフロントエンドの部分を担っているのでjetstreamから入れるとフロントエンドのコードもコピーされます。

publishした際にActions/Fotifyというディレクトリに処理が置かれるのですが、実際の処理はActionというよりはUseCaseに近くてActionsという名前に惑わされないようにしましょう。

基本処理の流れ

Fortifyの流れは以下のような感じになっています。

  1. routes.php からルーティングを読む
  2. コントローラーを読む(RegisteredUserControllerが一番シンプルで読みやすい)
  3. Actions/Fotifyの処理を実行する(必要な処理の場合)
  4. DIコンテナからレスポンスを取得して返す

となっています。
なお、4の箇所に関しては Contracts にResponse用のInterfaceが定義されているためこちらをDIする形になります。(実際にはFortify クラスのviewPrefixメソッドを使うでしょう)
データは基本的にくれないので、自分で情報を持ってきて組み立てることになります。

Jetstreamの場合はこの辺のviewの部分のstubをpublishしてくれていますね。

機能のON/OFFとか

機能として上げられていたFeatureに関してはconfig/fortify.phpにて編集が可能です。

    'features' => [
        Features::registration(),
        Features::resetPasswords(),
        // Features::emailVerification(),
        Features::updateProfileInformation(),
        Features::updatePasswords(),
        Features::twoFactorAuthentication(),
    ],

Viewに関して

viewに関しては標準だとviewの名前が決まっています。
Fortify.phpにviewの名前の指定があります。

対象のviewを置く場所に関してはServiceProvider上で定義してあげる必要があります。
この辺りで利用するメソッドに関しては Fortify クラスを参考にすると良いでしょう。

なお、Jetstreamの場合だとbootメソッドに

Fortify::viewPrefix('auth.');

の記述があります。そのため、views/auth以下にForityに関するviewを置くことになります。(stubがすでにコピーされています)

jetstreamの場合、app/Provider/JetstreamServiceProviderの他に、jetstreamのパッケージ内にLaravel\Jetstream\JetstreamServiceProviderが存在します。app/ProviderJetstreamServiceProviderが継承してくれていればわかりやすいのですが別物扱いされているのでわかりにくくなっています。それっぽい記述が見つからないときはパッケージ側を確認しましょう。