Laravel Sanctum生产环境API认证419错误及Cookie异常问题
核心配置修正
1. 环境变量(.env)配置调整
生产环境需统一域名相关配置,禁止混用带端口和不带端口的域名:
# 若前端为localhost:3000,按以下统一设置 SESSION_DOMAIN=.localhost # 前缀的点支持同域名下的端口访问 SANCTUM_STATEFUL_DOMAINS=localhost:3000 APP_URL=http://localhost:8000 # 后端实际访问地址 SESSION_DRIVER=cookie SESSION_SECURE_COOKIE=false # 本地测试用false,正式HTTPS环境设true
正式域名场景示例:若前端是
example.com:3000,则SESSION_DOMAIN=.example.com,SANCTUM_STATEFUL_DOMAINS=example.com:3000
2. CORS配置(config/cors.php)确保允许凭证
return [ 'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_methods' => ['*'], 'allowed_origins' => ['http://localhost:3000'], // 填写前端完整地址 'allowed_origins_patterns' => [], 'allowed_headers' => ['*'], 'exposed_headers' => [], 'max_age' => 0, 'supports_credentials' => true, // 必须设为true,允许携带Cookie ];
3. Sanctum配置(config/sanctum.php)验证状态域
确保状态域读取正确的环境变量:
return [ '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) : '' ))), // 其余配置保持默认 ];
Axios请求配置修正
前端必须开启withCredentials,确保请求携带Cookie:
// Axios全局配置 axios.defaults.withCredentials = true; // 登录前必须先获取CSRF Cookie(关键步骤) axios.get('http://localhost:8000/sanctum/csrf-cookie').then(() => { // 发起登录请求 axios.post('http://localhost:8000/api/login', { email: 'user@example.com', password: 'password' }); });
中间件注意事项
不要注释EnsureFrontendRequestsAreStateful中间件,该中间件是Sanctum处理状态请求的核心逻辑。注释后请求正常但无Cookie,本质是域名配置不匹配导致的绕路,并非中间件本身问题。
额外排查点
- 清除浏览器缓存和Cookie,避免旧配置干扰
- 重启后端服务,确保.env配置生效
- 确认前后端协议一致(均为HTTP或均为HTTPS),混合协议会导致Cookie无法携带
内容的提问来源于stack exchange,提问作者crepeMan29
相关产品推荐
相关产品推荐

