laravel 9 + sanctum 跨域认证失败主因是 csrf token 同步失败、cookie 域名不匹配或预检请求被拦截;需协同配置 cors 中间件(含 csrf-cookie 路径)、会话域策略(session_domain=.yourdomain.com)及 sanctum 状态域白名单(sanctum_stateful_domains)。

前端 SPA 使用 Laravel 9 + Sanctum 进行令牌认证时,跨域请求常出现“unauthenticated”或 419/403 错误——本质不是后端逻辑出错,而是 CSRF Token 同步失败、Cookie 域名不匹配或预检请求被拦截。修复需聚焦三处配置协同:CORS 中间件、会话域策略、Sanctum 状态域白名单。
确保 CORS 中间件正确启用并覆盖关键路径
Sanctum 的认证依赖 /sanctum/csrf-cookie 接口设置 XSRF-TOKEN Cookie,该路径必须纳入 CORS 允许范围,否则浏览器收不到响应头,后续请求无法携带 token。
- 确认已安装并发布配置:
php artisan vendor:publish --provider="Fruitcake\Cors\CorsServiceProvider" - 检查
app/Http/Kernel.php中,Fruitcake\Cors\HandleCors::class已加入$middlewareGroups['api'](不是全局$middleware) - 修改
config/cors.php:-
'paths' => ['api/*', 'sanctum/csrf-cookie'](必须包含 csrf-cookie) -
'allowed_origins' => ['https://app.yourdomain.com'](生产环境禁用['*'];若用 HTTP 开发,写http://localhost:3000) -
'supports_credentials' => true(前端带credentials: 'include'时必需) -
'allowed_headers' => ['Content-Type', 'Authorization', 'X-Requested-With', 'X-CSRF-TOKEN'](漏掉Authorization会导致 Bearer 请求被拒)
-
- 在
app/Http/Middleware/VerifyCsrfToken.php的$except数组中添加'sanctum/csrf-cookie'和'api/*',防止预检 OPTIONS 被 CSRF 中间件拦截
修正 Session 域名与安全策略以支持子域共享
若前端部署在 app.yourdomain.com、后端 API 在 api.yourdomain.com 或 yourdomain.com,Cookie 必须能跨子域传递,否则 XSRF-TOKEN 和 session 无法同步。
- 在
.env中设置:-
SESSION_DOMAIN=.yourdomain.com(开头的.是关键,表示通配所有子域) -
SESSION_SECURE_COOKIE=false(HTTP 环境下必须为 false;HTTPS 环境才设true) -
SANCTUM_STATEFUL_DOMAINS=app.yourdomain.com(只写前端域名,不加协议、端口或通配符)
-
- 在
config/session.php中显式声明:-
'domain' => env('SESSION_DOMAIN', null)(确保读取 .env 值) 'secure' => env('SESSION_SECURE_COOKIE', false)-
'same_site' => 'lax'(避免设为null或strict,影响子域间 POST 提交)
-
验证 Sanctum 配置是否动态加载状态域
硬编码或错误解析 APP_URL 容易导致域名匹配失败——例如把 http://app.yourdomain.com 当作完整字符串参与匹配,而 Sanctum 实际只比对 Host 头中的域名部分。
- 打开
config/sanctum.php,将'stateful'改为纯环境变量驱动: 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,localhost:3000,127.0.0.1'))- 删除任何基于
parse_url(env('APP_URL'))或sprintf拼接域名的逻辑 - 运行
php artisan config:clear清除配置缓存,确保新值生效
前端请求必须携带凭证且正确注入 token
后端配置再准确,前端未按规范发起请求也会失败。SPA 需主动管理两个 token:XSRF-TOKEN(自动随 Cookie 发送)和 Authorization Bearer(手动注入)。
- 首次访问前,先 GET
/sanctum/csrf-cookie(无 body,仅触发 set-cookie) - Axios 示例(Vue):
-
axios.defaults.withCredentials = true(启用 Cookie 传输) - 从
document.querySelector('meta[name="csrf-token"]')或响应头读取 XSRF-TOKEN,并设为axios.defaults.headers.common['X-XSRF-TOKEN'] - 登录成功后,将返回的 Bearer token 存入 localStorage,并在后续请求头中添加:
Authorization: Bearer {token}
-
- 确保前端域名与
SANCTUM_STATEFUL_DOMAINS完全一致(大小写、有无 www、有无端口)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











