Laravel Fortifyとは何なのか(概要,仕組み)
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への対応がある様子です。
注:viewの実装はありません。後に書いていますがviewの名前の指定はあり、ディレクトリを指定することになります。
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テーブルに追加するためです。
ただ、Fortifyだけの場合だとフロントエンドのコードは無いので自分で実装する形になります。(ここめちゃくちゃ重要で、Jetstream無しでFortifyやろうとするとここでつまづきます)
Jetstreamがちょうどフロントエンドの部分を担っているのでjetstreamから入れるとフロントエンドのコードもコピーされます。
基本処理の流れ
Fortifyの流れは以下のような感じになっています。
- routes.php からルーティングを読む
- コントローラーを読む(RegisteredUserControllerが一番シンプルで読みやすい)
-
Actions/Fotify
の処理を実行する(必要な処理の場合) - 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がすでにコピーされています)
Discussion