Laravelのログイン/ログアウト時のセッションの流れ
はじめに
Laravelのログイン/ログアウト時のセッションの流れのメモです。
フレームワークの中を少し覗いてLaravelと仲良く(なった気に)なるシリーズです。
シリーズ
- Laravelがセッションを作成してから保存するまでの流れ
- Laravelのログイン/ログアウト時のセッションの流れ
- Laravelでリクエストが認証済みか判定する流れ
諸々
- 環境
- laravel 12
- 参考
ドキュメントの確認
用語の整理
Laravelの認証機能
Laravelの認証機能は、その中核を成す「ガード」と「プロバイダー」で構成されています。
ガード
= ユーザーの認証方法を定義
ガードは、各リクエストにおけるユーザーの認証方法を定義します。例えば、Laravelには、sessionセッションストレージとCookieを用いて状態を維持するガードが標準装備されています。
プロバイダー
= 永続ストレージからユーザーを取得する方法を定義
プロバイダーは、永続ストレージからユーザーを取得する方法を定義します。Laravelは、Eloquentとデータベースクエリビルダーを使用したユーザー取得をサポートしています。ただし、アプリケーションの必要に応じて、追加のプロバイダーを自由に定義できます。
設定ファイル
= config/auth.php
アプリケーションの認証設定ファイルは にありますconfig/auth.php。このファイルには、Laravel の認証サービスの動作を微調整するための、よく文書化されたオプションがいくつか含まれています。
認証の仕組み
まず、認証の仕組みを考えてみましょう。Webブラウザを使用する場合、ユーザーはログインフォームからユーザー名とパスワードを入力します。これらの認証情報が正しい場合、アプリケーションは認証されたユーザーに関する情報をユーザーのセッションに保存します。ブラウザに発行されるCookieにはセッションIDが含まれており、アプリケーションへの後続のリクエストでユーザーを正しいセッションに関連付けることができます。セッションCookieを受信すると、アプリケーションはセッションIDに基づいてセッションデータを取得し、認証情報がセッションに保存されていることを確認して、ユーザーを「認証済み」とみなします。
Laravelの組み込みブラウザ認証サービス (上の認証の仕組みとほぼ同じ内容)
Laravelには、組み込みの認証サービスとセッションサービスが含まれており、通常はAuthとSessionファサードを介してアクセスされます。これらの機能は、Webブラウザから開始されたリクエストに対してCookieベースの認証を提供します。これらの機能は、ユーザーの資格情報を検証し、ユーザーを認証するための方法を提供します。さらに、これらのサービスは適切な認証データをユーザーのセッションに自動的に保存し、ユーザーのセッションCookieを発行します。
前提
今回はLaravel breeze
をインストールしています。そのため、記事内で登場する以下ファイルはLaravel breeze
のファイルです。
- routes
- Controller
- Request
その他の以下ファイルはlaravelのファイルです。(ログインやセッションの処理自体はLaravelの機能が使われる)
- ガードクラス
- セッションクラス
ログイン時のセッションの流れ
/auth.php
でルーティング(ログインパスは/register
)。
Auth/AuthenticatedSessionController.store
メソッドが実行。
Http/Requests/Auth/LoginRequest.php
のauthenticate
メソッドを実行。
1.ガードインスタンスを認証済み状態にする
$user = $this->provider->retrieveByCredentials($credentials)
で認証ユーザーを取得。
login
メソッド内の$this->setUser($user)
でガードインスタンスにユーザーをセットする。
2.新規のセッションのレコードを作成する
login
メソッド内の$this->updateSession()
で、セッションインスタンスの$this->attributes['login_xxx']
にログインユーザーのIDを追加。
$this->session->migrate(true)
でmigrate
メソッドの引数がtrue
なので、まずはDBから既存のセッションレコードを削除し、そのあとでセッションIDを再生成しセッションインスタンスの$this->id
にセット(セキュリティ対策)
さらに$this->exists
プロパティをfalse
に更新。(レスポンスが返る前にのミドルウェアでの保存処理する前に、更新か新規追加かの判定でも使われる)
(3.セッションID再発行)
すでにセッションIDは新規発行済みですが、Controller側の$request->session()->regenerate()
メソッドでもmigrate
メソッドを呼んでいるので再度(2度目)セッションIDを新規発行している?
ログアウト時のセッションの流れ
app/Http/Controllers/Auth/AuthenticatedSessionController.php
コントローラーのdestroy
アクションで実行されます。
1.ガードインスタンスを認証済みではない状態にする
$this->user = null;
でnullにする
2.対象のセッションのレコードを削除する
$this->migrate(true);
でmigrate
でtrue
を指定しているのでmigrate
メソッド内で既存のセッションのレコードを削除しつつ、セッションをIDを再発行している。
シリーズ
- Laravelがセッションを作成してから保存するまでの流れ
- Laravelのログイン/ログアウト時のセッションの流れ
- Laravelでリクエストが認証済みか判定する流れ
Discussion