LoginSignup
3
2

More than 1 year has passed since last update.

Cookie にSession 情報保存されない?そう、デフォの api.php ならね。

Posted at

はじめに

Laravel 6で開発してて詰まったことあったので備忘録で残しておきます。

やりたかったこと

Session 情報をcookie に保存したかった。

下記のようなコードを書いた。

api.php
Route::post("set_token", "Controller@setToken");
Route::get("fetch_token", "Controller@getToken");
Controller
public function setToken(Request $request){
   session()->put('token', $token);
}

public function getToken(){
    $token = session()->get('token');
    return response()->json(['token' => $token]);       
}

シンプルなセッション情報の保存と、別リクエストでのその情報の利用です。

でもなぜかできない。セッション情報が保存されていない。

リクエスト内で保存直後に確認してみるとちゃんと入っている。そのリクエストが終了するとセッション情報もリセットされてしまう。

もちろんセッションドライバーは下記の通りcookieになっていることは確認した。

.env
SESSION_DRIVER=cookie

api.phpに書かれたルーティングのリクエストではcookieの使用ができない。

これがわかったので、先程のルーティングの記述をweb.phpに移動させれば完了なのだが、web.phpではCSRFトークンの認証が必要となるため、それだと諸事情があって都合が悪かった。

解決策

当たり前ですが、デフォルトの web.php と api.php では、処理が違います。

\App\Http\Kernel.php にそれが記述されているので、そこを変更してやれば解決します。

App Http Kernel.phpへの追記

Kernel

デフォルト

\App\Http\Kernel.php
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,
        ],
    ];

変更後

\App\Http\Kernel.php
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 が使えるようになることで、セキュリティ上の不都合ありそうな気はします。

その辺はちゃんと調べきれてないので、もし詳しい方いらっしゃいましたらコメントいただけますと幸いです。

参考記事

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2