Uncategorized

Laravelの認証の根幹、ガードとプロバイダとはなんなのか

Laravelの認証は、「ガード」と「プロバイダ」から構成されるモジュールが根幹です。ガードは各リクエストのユーザ認証を定義し、プロバイダは永続ストレージ(MYSQLなどのDB)からのユーザの取得方法を定義します。

Guard(ガード)とは

「ユーザをどう認証するか」を定義するものです。
driverは認証方法、providerはユーザテーブルを指定します。
web, apiとあるのは、認証の利用目的を明確にするためで、キーの名前自体はなんでもいいです。

例:

PHP
'guards' => [
    'web' => [
        'driver' => 'session',   // 認証の方法→session認証
        'provider' => 'users',   // どのユーザーテーブルを使うか
    ],

    'api' => [
        'driver' => 'token',     // 認証の方法→トークン認証
        'provider' => 'users',   // どのユーザーテーブルを使うか
        'hash' => false,         // APIトークンをハッシュ化するか
    ],
],

認証方法 ①: session認証

Webアプリでもっとも一般的な認証方式かと思います。
初回ログイン時にサーバに「セッションID」を保存し、そのセッションIDをブラウザのCookieに渡します。
そしてそれ以降のリクエストでは、Cookieに保存されているセッションIDを使って送信し、サーバ側で認証をします。
例え:お店(サーバ側)が発行する会員カードを会員に付与している。

session認証の流れ

  1. ユーザーがログインフォームで送信
  2. サーバーで認証成功 → セッションIDを発行
  3. レスポンスを返す際、ブラウザのCookieにセッションIDを保存
  4. 次のリクエスト以降、そのCookieをもとにユーザーを特定

認証方法②:token認証

ログイン成功時にサーバ側がトークン(署名付き文字列)を発行します。
クライアントはそれを保持し、以降のリクエストでトークンをヘッダにつけて送信する。
例え:(クライアント側が)身分証明証を常に持ち歩いている

token認証の流れ

  1. ログインAPIにメールとパスワードを送信
  2. 認証成功 → アクセストークン発行
  3. クライアント(アプリやSPA)が保存(例:localStorage)
  4. 以後、すべてのリクエストにトークンを付与

その他の認証方法

認証方法や、認証を使いやすくした機能に関してはあらかじめライブラリとして用意されているSanctum、Passportなども存在します。必要ライブラリ導入のうえ、config/auth.phpdriverに定義することで利用することができます。

※Laravel Breezeなどは、認証方法を提供するライブラリではなくLaravel標準の認証方法を使いやすくセットアップしてくれるスターターキットだと考えていいようです。

Provider(プロバイダー)とは

「ユーザをどこからどのように取得するか」を定義するもの。Guard側で指定した、provider(ユーザデータ)の詳細を記述する。
driverはEloquent

例:

PHP
'providers' => [
    'users' => [
        'driver' => 'eloquent',              // Eloquent経由で取得
        'model' => App\Models\User::class,   // 使用するモデル
    ],

    // クエリビルダで直接取りたい場合(通常はEloquent経由で取得することが多い)
    // 'users' => [
    //     'driver' => 'database',
    //     'table' => 'users',
    // ],
],

主な記述方法

Guardはライブラリを導入することで、様々拡張することができましたが、基本的にはProviderの設定方法は限られています。

どのように取得するか

ユーザ情報をどのように取得するかを、driverで設定します。多くの場合Eloquent経由で取得しますのでdriver => eloquentと記載することが多いでしょう。Laravelの設計自体がEloquentを中心に作られていることもそうですし、多くの認証系機能はEloquent前提で作られているためです。

さいごに

Guardは「ユーザをどう認証するか」、Providerは「ユーザをどこから取得するか」です。
認証方法に関しては、さまざまな拡張方法が存在するのでぜひ調べてみてください。

-Uncategorized