You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Passport中如何解决预检响应不允许x-xsrf-token的CORS错误?

问题分析与解决方案

错误原因

这个CORS错误的核心是:浏览器发起的预检请求(preflight)返回的Access-Control-Allow-Headers中没有包含x-xsrf-token字段,但你的Angular应用自动在请求里添加了这个头,导致浏览器拦截了后续请求。

虽然你在config/cors.php里设置了allowed_headers => ['*'],但实际场景中,部分浏览器对自定义请求头(比如x-xsrf-token)不会直接通过通配符*匹配,必须显式声明允许该头。另外,你的认证流程涉及domain-b.com的跳转,也需要确保CORS配置覆盖到相关路由与来源。

解决方案

1. 显式声明允许的请求头

修改config/cors.php中的allowed_headers,将x-xsrf-token明确加入:

'allowed_headers' => ['*', 'x-xsrf-token'],
// 也可以更精准地列出所需头:
// 'allowed_headers' => ['x-xsrf-token', 'content-type', 'accept', 'authorization'],

这样能确保预检请求返回的响应头包含该字段,浏览器不会拦截请求。

2. 调整CORS中间件执行顺序

打开app/Http/Kernel.php,确保HandleCors中间件在所有其他中间件(包括Passport相关中间件)之前执行,比如放在$middleware数组最前面:

protected $middleware = [
    \Illuminate\Http\Middleware\HandleCors::class,
    // 其他中间件...
];

如果CORS中间件执行太晚,预检请求可能被其他中间件拦截,导致返回的响应头不符合要求。

3. 核对认证流程中的域名与URI配置

  • 错误显示重定向来自https://domain-b.com/login,若该域名是你认证流程的一部分(比如登录页部署在此),可以尝试将https://domain-b.com和http://localhost:8100显式加入allowed_origins,排除通配符*可能带来的兼容问题。
  • 确认Passport客户端的redirect URI与Angular应用接收授权码的地址完全匹配,包括协议(http/https)、域名和端口。

4. 清理浏览器缓存

修改配置后,清理浏览器缓存或使用无痕模式测试,避免旧的CORS响应头缓存影响结果。

内容的提问来源于stack exchange,提问作者Zoba82

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:22:21