🙌

Laravel Sanctum × React で /me がずっと401になる地獄を突破した記録

に公開

✅ はじめに

・Laravel Sanctum + SPA構成(React)でハマった
・/me がずっと401
・全てやった「つもり」だったが動かない
・犯人は…ログイン処理における“たった1行の不足”だった

🧩 環境構成

・Laravel v8.83.29
・Sanctum導入済
・React + Vite(フロントエンド)
・Axios + React Query
・認証はセッションベース

🔥 発生していた問題

ログインは成功しているように見える(チケット一覧に遷移)
しかし /me は常に 401
Laravel 側のログに /me アクセスが出ない
Cookie や XSRF トークンは送られている

🧪 試したこと(全部ダメだった)

EnsureFrontendRequestsAreStateful の確認
SANCTUM_STATEFUL_DOMAINS の設定
SESSION_DOMAIN / SECURE_COOKIE の整合
Laravel キャッシュ完全リセット
Cookie 削除 → 再ログイン
Axios 設定見直し(withCredentials, baseURL)
/me のルーティング見直し(AuthController vs Closure)

🧨 真の原因(ラスト1行)

// AuthController.php

public function login(Request $request)
{
    $credentials = $request->only('email', 'password');

    if (!Auth::attempt($credentials)) {
        return response()->json(['message' => 'Invalid credentials'], 422);
    }

    // これ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    $request->session()->regenerate();

    return response()->json(['message' => 'Logged in']);
}

🎉結果

セッションにユーザーが記録され
auth()->user() が取得可能に
/me がようやく 200 に
長き戦いが終わった……

🙏 終わりに

Laravel × React × Sanctumは強力だけど、セッション認証の構造が非常に繊細
もしログイン直後の /me が401でハマってる人がいたら、まずは $request->session()->regenerate(); を疑って!
そして、この投稿が誰かの命を救うことを願ってる🔥

Discussion