API開発でもCookieを使った認証がしたい!!!(Laravel)

2 min read読了の目安(約2300字

LaravelでAPIベースのシステム開発をするときに、デフォルトではトークンを使用した認証が想定されています。

最近ではLaravel Sanctumというのが出てきましたが、それもトークンでの認証が想定されていますし、JWTを使用してトークン認証をするという方法もあります。

モバイルアプリ開発の場合はCookieを用いた認証ができないのでトークン認証を用いることが多いと思いますが、Webシステムの場合はCookieを用いた認証も手段としてありだと思います。

というわけで、LaravelでAPI開発でもCookieを用いた認証をしたい!!

Kernel.phpを編集する

app/Http/Kernel.phpmiddlewareGrouop にいろいろ追記します

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    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' => [
            \App\Http\Middleware\EncryptCookies::class, // 追記 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, // 追記
            \Illuminate\Session\Middleware\StartSession::class, // 追記
            \Illuminate\View\Middleware\ShareErrorsFromSession::class, // 追記
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

APIではないWebシステム開発ではCookieを使用した認証が行われているので、その設定をパクればいいというわけですね。

なので、 middlewareGroupweb のところにある4行をそのまま持ってきました。

auth.phpを編集する

auth.phpでapi認証の場合はCookieを使用するように設定します。

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'session', // 編集
            'provider' => 'users',
        ],
    ],

デフォルトでは driverは token になっているかと思いますが、ここを sessionに変えてあげます。
そうすると cookieを使用したセッション認証に設定されます。

この設定をせずにAPIでセッション認証をしようとした自分に襲いかかった謎現象

僕はこの設定の存在を知らずに、デフォルトでセッション認証できると思って、middlewareにauthをつけて API実装してみました。

するとログインの部分で、 見た目は「成功!」ってなってるのに、ログイン後にauthミドルウェアに通らないのです。

成功してるのにログインできてないってどういうことだ?? と数時間頭を悩ませ続けました。

cookieのセッション認証を許可していないので、バックエンド側ではログイン認証したつもりでも、フロントエンド側ではそのログイン情報を保持していなかったのですね。

おわりに

というわけで、メモも兼ねてAPIでセッション認証する方法を書きました。
どの記事を見てもトークンベースの認証の話が多いのですが、セッション認証のデメリットとかなにかあるのかなあ...?というわけで引き続きもう少し調べてみたいと思います。