#はじめに
Laravel 6で開発してて詰まったことあったので備忘録で残しておきます。
やりたかったこと
Session 情報をcookie に保存したかった。
下記のようなコードを書いた。
Route::post("set_token", "Controller@setToken");
Route::get("fetch_token", "Controller@getToken");
public function setToken(Request $request){
session()->put('token', $token);
}
public function getToken(){
$token = session()->get('token');
return response()->json(['token' => $token]);
}
シンプルなセッション情報の保存と、別リクエストでのその情報の利用です。
でもなぜかできない。セッション情報が保存されていない。
リクエスト内で保存直後に確認してみるとちゃんと入っている。そのリクエストが終了するとセッション情報もリセットされてしまう。
もちろんセッションドライバーは下記の通りcookieになっていることは確認した。
SESSION_DRIVER=cookie
api.phpに書かれたルーティングのリクエストではcookieの使用ができない。
これがわかったので、先程のルーティングの記述をweb.phpに移動させれば完了なのだが、web.phpではCSRFトークンの認証が必要となるため、それだと諸事情があって都合が悪かった。
解決策
当たり前ですが、デフォルトの web.php と api.php では、処理が違います。
\App\Http\Kernel.php にそれが記述されているので、そこを変更してやれば解決します。
App Http Kernel.phpへの追記
Kernel
デフォルト
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class, // <--
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, // <--
\Illuminate\Session\Middleware\StartSession::class, // <-- web.php内に記述されたルーティングのリクエストは、これらのミドルウェアによりCookie が使用できる
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
変更後
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
// この3行の追記
+ \App\Http\Middleware\EncryptCookies::class,
+ \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+ \Illuminate\Session\Middleware\StartSession::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
これでapi.php 内のリクエストでもSession情報をcookie に保存できます。
#おわりに
本来は、api.php は外部からのリクエストをルーティングするためのファイルです。
なので、もしかしたら session や cookie が使えるようになることで、セキュリティ上の不都合ありそうな気はします。
その辺はちゃんと調べきれてないので、もし詳しい方いらっしゃいましたらコメントいただけますと幸いです。
参考記事