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

Deployerで複数の環境やサーバにデプロイするには

1 はじめに2 hosts.ymlファイルの作成3 プロダクション・ステージング環境を分ける3.1 ymlファイルの記載3.2 デプロイコマンド4 複数台のサーバに同時リリースする4.1 ymlファイ ...

Go言語

go:embedとGo 1.16、1.17での変更点まとめ

1 はじめに1.1 変更点一覧2 go:embedとは3 go:embedの使い方3.1 基本的な使い方3.2 複数のファイルを埋め込む3.3 異なるディレクトリのファイルを埋め込む3.4 ディレクト ...

麻雀で自分が何を切るか学習させる

1 はじめに2 プロジェクト名を決めてみる3 何切る問題で考慮される要素3.1 手牌3.2 ドラ3.3 考慮していない要素(本当は入れたい)4 学習の方法5 さいごに はじめに 前回執筆しました、配牌 ...

Pythonで書かれたスクレイピングのコードをRubyで書いてみる

1 はじめに2 仕様3 ソースコード4 使用したモジュール、Gem5 対象ページを取得6 XPATHから目的のものを抜き出す7 次のページのリンクを取得する8 さいごに はじめに 以前、技術評論社さん ...

laravel logo

Laravelでの署名付きURL生成

1 はじめに2 今回のサンプル3 ビュー4 ルーティング5 コントローラー5.1 署名付きURLの生成5.2 期限ありの署名付きURLの生成5.3 署名のチェック6 おまけ6.1 署名の仕組7 さいご ...

フォロー

blog-page_side_responsive

2020年11月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

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