[Laravel] APIのレスポンスでセッションを有効にする方法
![[Laravel] APIのレスポンスでセッションを有効にする方法](/static/2d736a8e5b3e61246555686162565510/9bec7/HERO.png)
こんにちは。最近、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つ詳しくなった気分になりました(笑)




