[Laravel] APIのレスポンスでセッションを有効にする方法
こんにちは。最近、Steam で Portal と Portal 2 がセールでそれぞれ 60円 (90%オフ)になっていて両方買ってしまった1 k-so16 です。
Laravel でログイン中のユーザー情報をAPI経由で取得しようとすると、 Auth::check()
で認証されていないと判定され、ユーザーの情報が得られないという現象に見舞われました。
本記事では、Laravel でAPI経由でログインの状態を扱えるように設定する方法を紹介します。本記事の前提として、APIで返されるリソースにアクセストークンは入っていないものとします。
本記事が想定する読者層は以下の通りです。
- Laravel の ルーティングの設定について知っている
- Laravel の
Auth
の基本的な利用方法を知っている - Cookie, セッションについて知っている
原因
Laravel から返ってくるAPIのレスポンスヘッダーに、Cookieが付随していないことが原因でした。セッションが有効ではないので、ログイン状態が維持されず、 Auth::check()
が false
を返し、認証情報が得られませんでした。
APIではトークンによって認証情報を扱うことを想定しているので、Cookie やセッションが有効化されていないと考えられます。
解決方法
Laravel のデフォルトでは、 route/web.php
に記述されるURLには Cookie やセッションに関するミドルウェアが動作しますが、 route/api.php
にルーティングされているURLには動作しません。APIへのルーティングに設定されているレスポンスにも Cookie やセッションを有効化するために、 app/Http/Kernel.php
に記述されている API のミドルウェアの設定に Cookie とセッションのミドルウェアを追加します。設定例は以下の通りです。
protected $middleWareGroups = [
// 中略
'api' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Midleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
'throttle:60,1',
'bindings',
],
];
$middlewareGroups
の web
に設定されているミドルウェアが route/web.php
にルーティングされているURLに対して、 api
に設定されているミドルウェアが route/api.php
にルーティングされているURLに対して有効化されます。 Cookie やセッションのミドルウェアは、 web
に設定されているものをコピペすれば、 route/web.php
と同様に扱えます。
API に対してセッションを有効化する方法について、以下のページを参考にしました。
総括
本記事のまとめは以下の通りです。
- Laravel のデフォルトではAPIのレスポンスには Cookie やセッションは無効
- APIのルーティングに対して Cookie やセッションに関するミドルウェアを設定することで有効化
以上、 k-so16 でした。 Laravel について、また1つ詳しくなった気分になりました(笑)