Laravel 10 中配置 CORS 配合 Sanctum 的核心是确保前端能安全携带 Cookie 发起认证请求,需正确注册中间件顺序、配置 cors.php 支持凭证、设置 sanctum.php 的 stateful 域名,并在前端先调用 /sanctum/csrf-cookie 再启用 credentials。

在 Laravel 10 中配置 CORS 配合 Sanctum,核心是让前端(如 Vue/React)能安全携带 Cookie 发起认证请求,同时通过 CSRF 保护和跨域头控制实现 SPA 场景下的状态化登录。关键不在“加 CORS”,而在“让 Sanctum 的会话机制与跨域策略协同工作”。
确保 Sanctum 和 CORS 中间件正确注册
Laravel 10 默认已集成 fruitcake/laravel-cors(无需再安装),但需确认中间件已在 API 路由组中启用:
- 打开
app/Http/Kernel.php - 检查
$middlewareGroups['api']数组是否包含以下两项(顺序很重要):-
\Illuminate\Http\Middleware\EnsureFrontendRequestsAreStateful::class—— Sanctum 的核心中间件,必须放在最前 -
\Fruitcake\Cors\HandleCors::class—— 必须紧随其后,确保预检请求能被正确响应
-
错误示例:把 HandleCors 放在 EnsureFrontendRequestsAreStateful 之后太远,或误加到 web 组里,会导致 Cookie 未设置就返回 CORS 头,登录失败。
配置 config/cors.php 兼容凭证传输
运行命令生成配置(即使 Laravel 10 已内置,也建议执行以自定义):
php artisan vendor:publish --provider="Fruitcake\Cors\CorsServiceProvider"编辑 config/cors.php,重点配置以下几项:
-
paths:至少包含
['api/*', 'sanctum/csrf-cookie'],确保 CSRF 接口也能跨域 -
allowed_origins:必须写具体域名,例如
['http://localhost:5173', 'https://myapp.com'];禁止用['*'](否则supports_credentials无效) -
supports_credentials:设为
true,这是让浏览器发送 Cookie 的前提 -
allowed_headers:建议设为
['*']或显式列出['Content-Type', 'X-Requested-With', 'Authorization', 'X-CSRF-TOKEN']
验证 Sanctum 的 stateful 域名设置
Sanctum 依赖 stateful 配置来判断哪些域名允许发起带 Cookie 的请求。编辑 config/sanctum.php:
- 确认
'stateful'数组包含你的前端地址,格式与cors.allowed_origins一致,例如:
['localhost', 'localhost:5173', '127.0.0.1:5173', 'myapp.com'] - 注意:这里不带协议(
http://或https://),只写主机名或带端口的主机名 - 生产环境务必使用真实域名,且确保 Cookie 的
domain和secure属性匹配(HTTPS 环境下secure必须为true)
前端配合要点(不可跳过)
CORS 配置生效,离不开前端主动配合:
- 首次请求先访问
/sanctum/csrf-cookie(GET),触发服务端设置 Cookie - 后续所有请求(包括登录)的 axios/fetch 需启用凭证:
axios.defaults.withCredentials = true 或
fetch('/api/login', { credentials: 'include' }) - 登录成功后,后续请求会自动携带 Cookie,无需额外传 token
漏掉任一环,都会表现为“登录接口 200 成功但 /user 返回 401”,本质是 Cookie 没发过去。


















