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


関連記事

rails

はじめてのrails、まずはローカル環境構築してみる

1 はじめに2 必要なライブラリ・ツールのインストール2.1 homebrew, rbenv2.2 rbenv-communal-gems3 最新安定版のrubyをインストール4 bundler, r ...

rails

関連するモデルのレコードを一緒に作成する方法

1 はじめに1.1 前提条件2 実装2.1 モデルの作成2.2 コントローラの作成2.3 Viewの作成3 さいごに はじめに フォームからレコードを作成する際に、関連するモデルのレコードを一緒に作成 ...

rails

Rails 6の変更点と新機能

1 はじめに2 概要3 Rubyのサポートバージョン4 Webpacker4.1 Webpackerの設定4.2 Webpackerでのビルド4.3 ビルドしたJavaScriptファイルを読み込む4 ...

Laravelの開発環境をdocker-composeで一から構築してみる

1 はじめに2 nginxでwebサーバを立てる2.1 default.conf作成2.2 index.html作成2.3 nginxコンテナ起動3 nginxでPHP-FPMを動作させる3.1 do ...

rails

Shrineでアップロードする際に画像を加工する

1 はじめに2 アップロードする画像のリサイズ2.1 Gemを追加2.2 Uploaderの修正3 サムネイルを作成する3.1 Uploaderの修正3.2 サムネイルを表示する4 バリデーションの追 ...

フォロー

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