BackEnd

コードでわかるLaravelのブラウザ認証

投稿日:2020年11月30日 更新日:

はじめに

Laravel 8からは、認証機能のscaffoldとして、これまで推奨されていたLaravel UIの代わりに、Laravel Jetstreamが推奨されるようになりました(Laravel 8でも使用することはできます)。しかし、このLaravel Jetstreamが高機能で見た目が良いかわりに、細かなカスタマイズがしにくいことから、Laravel UIを採用するケースもあるようです。

認証機能の実装については、これらのライブラリを使用する他に、Laravelの認証クラスを直接使って、自前の認証機能を実装することもできます。

そこで、今回はLaravelのブラウザ認証クラスの処理の流れをコードを示しながら紹介します。

認証機能の概要

認証機能では、 guardprovider が重要な概念となります。

guard は、リクエスト毎にユーザーを認証する方法を定義しています。これには、セッションストレージとクッキーを使って状態を保持する SessionGuard と、トークンを使って認証する TokenGuard があります。

provider はデータベースなどの永続ストレージから、ユーザーを取得する方法を定義しています。これには、 Eloquent を使う EloquentUserProvider と、クエリビルダーを使う DatabaseUserProvider があります。

また、 guardprovider を自前で実装することもできます。

それでは、実際にコードを見てみましょう。

Controller

ログイン時、コントローラでは、 Auth ファサードの attempt() メソッドでユーザーを認証します。

Auth::attempt() に認証で使用するパラメータの配列を渡します。実際には、 SessionGuard クラスの attempt() メソッドが呼ばれます。

また、ログイン状態を維持したい場合は、 attempt() メソッドの第2引数に true を渡します。

なお、ユーザーを取得する条件は、例の通りである必要はありません。たとえば、 email の代わりに、 user_code などの何らかのユニークなカラムを指定することができます。さらに、 credentials['role'] = 1; などのように、追加の条件を付加することもできます。

Auth ファサードの guard() メソッドを使うと、使いたいguardインスタンスを指定することができます。これにより、異なる複数の認証処理を併用することができます。

SessionGuard

SessionGuard クラスでは、ユーザの認証、RememberTokenの更新、認証済みのユーザーインスタンスへのアクセスなどの機能を提供します。

SessionGuard クラスの attempt() メソッドを抜粋しました。順番に処理を見てきます。

fireAttemptEvent

初めに fireAttemptEvent() メソッドが呼ばれ、 Attempting イベントが発行されます。

retrieveByCredentials

ここでは、 auth.php で指定した UserProviderretrieveByCredentials() メソッドが呼ばれ、 Illuminate\Contracts\Auth\Authenticatable 、もしくは、 null が返却されます。

hasValidCredentials

ここでは、(1)渡された認証情報を検証し、(2)成功すればイベントを発行します。

login

ここでは、(1)セッションストレージのIDを更新し、 $remember がtrueかつ、RememberTokenが空の場合、(2)新しいRememberTokenを発行して、(3)クッキーが更新されます。その後、(4) Login イベントが発行されて、認証されたユーザーがセットされ、 Authenticated イベントが発行されます。

fireFailedEvent

hasValidCredentials() メソッドで検証に失敗した場合、 Failed イベントが発行されます

EloquentUserProvider

UserProvider は、データベースなどの永続ストレージからユーザーを取得する機能を提供します。

retrieveByCredentials

SessionGuard クラスの attempt() メソッドから呼ばれます。渡された credentials をもとにユーザーを取得し、 model を返却します。

(1)渡された credentials をチェックし、問題があれば null を返却します。(2)認証用の model を返却します。(3)認証のためのクエリを組み立てます。(4)最初に見つかったユーザーを返却します。

retrieveByToken

SessionGuard クラスの userFromRecaller メソッドから呼ばれます。渡されたユーザーを識別する値をもとにユーザーを取得し、そのユーザーのRememberTokenとユーザーを比較して、 model または null を返却します。

(1)認証用の model を返却します。(2)認証のためのクエリを組み立て、最初に見つかったユーザーを返却します。(3)ユーザーが見つからなければ null を返却します。(4)見つかったユーザーのRememberTokenを取得します。(5)渡されたRememberTokenとユーザーのRememberTokenを比較し、一致すればユーザーを、一致しなければ null を返却します。

DatabaseUserProvider

EloquentUserProvider と同じく、データベースなどの永続ストレージからユーザーを取得する機能を提供します。 EloquentUserProvider では、ユーザーの取得にEloquentを使っていましたが、こちらはクエリビルダーを使います。

retrieveByCredentials

SessionGuard クラスの attempt() メソッドから呼ばれます。渡された credentials をもとにユーザーを取得し、 model を返却します。

(1)渡された credentials をチェックし、問題があれば null を返却します。(2)認証のためのクエリを返却します。(3)認証のためのクエリを組み立てます。(4)最初に見つかったユーザーを返却します。(5)ユーザーを Illuminate\Auth\GenericUser に変換して返却します。

retrieveByToken

SessionGuard クラスの userFromRecaller メソッドから呼ばれます。渡されたユーザーを識別する値をもとにユーザーを取得し、そのユーザーのRememberTokenとユーザーを比較して、 model または null を返却します。

(1)認証のためのクエリを組み立て、最初に見つかったユーザーを返却します。(2)渡されたRememberTokenとユーザーのRememberTokenを比較し、一致すればユーザーを、一致しなければ null を返却します。

さいごに

Laravelのブラウザ認証の流れをコードを示しながら紹介しました。API認証の方も、似たような流れになっています。API認証に興味があれば、よければこちらの記事もご覧ください。

おすすめ書籍

PHPフレームワークLaravel入門 第2版 初めてのPHP

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

Stripe Connectで支払方法をクローンする

1 はじめに2 プラットフォームの顧客側の実装2.1 プラットフォームの顧客登録2.2 支払方法の登録3 支払方法クローンの実装3.1 顧客と支払方法のクローン3.1.1 支払方法のクローン3.1.2 ...

[Dialogflow + CF] アクア様が罵倒してくれたり天気を教えてくれるSlackボットを作る

1 はじめに2 Dialogflowの準備2.1 プロジェクトを作る2.2 Intentを作る2.3 試してみる2.4 WELCOME Intentを作る3 Slackボットを作る4 名前を答える5 ...

laravel logo

LaravelのArtisanコマンドを自作する

1 はじめに2 コマンドの作成方法3 コマンドの実装3.1 文字列出力3.2 引数3.3 オプション3.4 入力を使用した対話型3.4.1 ask()メソッド3.4.2 secret()メソッド3.4 ...

Stripe Connectでダイレクト支払い導入編

1 はじめに2 事前準備3 StripeConnectの導入3.1 stripeパッケージの導入3.2 envの実装4 店舗アカウントの登録4.1 Stripe Connectの設定4.2 Oauth ...

laravel logo

Laravel Cashier サブスクリプションに使用するテーブルを理解する

1 はじめに2 Laravel Cashierのテーブル2.1 usersテーブル2.2 subscriptionsテーブル2.3 supscription_itemsテーブル3 課金情報の更新方法4 ...

フォロー

blog-page_side_responsive

2020年11月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。