🔐

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

2020/09/20に公開

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の流れは以下のような感じになっています。

  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がすでにコピーされています)

Discussion