Laravel Sanctum Cookie认证返回未授权问题排查求助
核心排查与修复点
1. 配置文件校验
sanctum.php:确认
stateful数组包含你的请求域名(含端口,前后端分离场景必须加):'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' ))),本地测试时,前端端口(如3000)必须明确写入,不能只写
localhost。cors.php:强制开启
supports_credentials,并指定允许的前端域名:'supports_credentials' => true, 'allowed_origins' => ['http://localhost:3000'], // 替换为你的实际前端地址session.php:本地开发环境下,
domain设为null或.localhost,secure设为false:'domain' => env('SESSION_DOMAIN', null), 'secure' => env('SESSION_SECURE_COOKIE', false),
2. 请求传递规则
前端请求必须携带
withCredentials: true(以Axios为例):axios.get('/api/user', { withCredentials: true })该参数会自动携带
laravel_session和XSRF-TOKENCookie,这两个是Cookie认证的核心凭证,无需手动传递登录返回的auth_token——那个令牌是用于Bearer认证的,和Cookie认证逻辑无关。原生Fetch请求需手动处理XSRF:
const xsrfToken = document.cookie.match(/XSRF-TOKEN=([^;]+)/)[1]; fetch('/api/user', { headers: { 'X-XSRF-TOKEN': decodeURIComponent(xsrfToken) }, credentials: 'include' });
3. 路由与登录逻辑修正
受保护路由必须同时使用
api和auth:sanctum中间件,禁止混用web中间件:Route::middleware(['api', 'auth:sanctum'])->get('/user', function (Request $request) { return $request->user(); });登录逻辑必须触发Session创建,不能仅生成个人访问令牌:
public function login(Request $request) { $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); if (!Auth::attempt($credentials)) { return response()->json(['message' => 'Invalid credentials'], 401); } // Auth::attempt会自动创建Session,这是Cookie认证的关键 return response()->json(['user' => Auth::user()]); }单纯调用
$user->createToken()只会生成令牌记录,但不会创建Session,导致Cookie认证失效。
4. 快速验证步骤
- 清除浏览器缓存与Cookie,重新发起登录请求
- 打开浏览器开发者工具,确认请求Cookie包含
laravel_session和XSRF-TOKEN - 检查请求头是否存在
X-XSRF-TOKEN(Axios自动携带) - 查看后端日志
storage/logs/laravel.log,定位具体认证报错信息
内容的提问来源于stack exchange,提问作者cookie
相关产品推荐
相关产品推荐

