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


関連記事

laravel logo

laravel-enumを使ってみたら快適だった

1 はじめに2 enumについて3 環境4 導入5 enumクラス5.1 生成5.2 enumクラス編集5.3 日本語化6 マイグレーション6.1 生成6.2 編集7 プロパティのキャスト8 さいごに ...

rails

Railsでの非同期処理とDelayed Job

1 はじめに2 Active Job2.1 Active Jobの役割2.2 ジョブを作成する2.3 ジョブをキューに登録する2.4 コールバック2.5 例外3 Delayed Job3.1 設定3. ...

aws

ALB+EC2な環境でhttpをhttpsにリダイレクトする

1 はじめに1.1 前提条件2 ALBの設定3 Nginxの設定3.1 注意点4 さいごに はじめに httpsに対応済みのWebサイトの場合、httpでアクセスされた時にhttpsでリダイレクトする ...

Go言語

Go言語でテスト作成 testifyの基本的な使い方

1 はじめに2 Goテストフレームワークのスター数3 testifyについて3.1 testifyを導入する方法4 assartionについて4.1 assertion紹介4.2 ElementsMa ...

laravel logo

Laravelで画像アップロード実装が楽になるかもしれないlaravel-imageup

1 はじめに2 環境3 導入4 実装5 個人的にハマったこと5.1 配列はダメ5.2 PHPStanで引っかかる6 さいごに7 おすすめ書籍 はじめに こんにちは。webアプリケーションを作る際にファ ...

フォロー

follow us in feedly

blog-page_side_responsive

2020年11月
1234567
891011121314
15161718192021
22232425262728
2930 

アプリ情報

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