🙌
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