Laravel+Next.js生产环境无法生成X-XSRF-TOKEN Cookie求助
问题排查方案
软件版本
- Sanctum版本:^2.14.1
- Laravel版本:9.0
- PHP版本:^8.0.2
- 数据库驱动及版本:Heroku PostgreSQL 14.4
项目背景
项目拆分backend(基于Laravel Breeze)和frontend(Next.js应用)两个目录,开发阶段按breeze-next文档操作完全正常。目前Laravel API已部署到Heroku,Next.js前端部署到Vercel,对应环境变量均已配置。
已解决问题
- 跨域资源共享(CORS)问题:通过Laravel配置+Heroku添加
FRONTEND_URL环境变量解决 CSRF token mismatch错误:调整配置并将session驱动改为cookie解决
当前故障
生产环境可正常完成注册,但无法生成X-XSRF-TOKEN等认证Cookie;登录操作同样无法生成所需认证Cookie,开发环境无此问题。浏览器给出明确提示:
此通过Set-Cookie头设置Cookie的尝试被阻止,因为其SameSite属性为"lux",且来自跨站点响应,并非顶级导航的响应。
排查与修复步骤
修正SameSite配置错误
浏览器提示的lux是明显拼写错误,需检查config/session.php中的same_site参数:- 跨域场景下需设置为
'none' - 同时必须开启
secure为true(SameSite=None要求Cookie必须通过HTTPS传输) - 也可通过Heroku环境变量
SESSION_SAME_SITE直接设置,优先级高于配置文件
- 跨域场景下需设置为
验证Sanctum状态域配置
- 检查
config/sanctum.php的stateful数组,确保已加入Vercel前端域名(例如['your-app.vercel.app']) - 确认Heroku上的
SANCTUM_STATEFUL_DOMAINS环境变量已正确配置,值为前端完整域名
- 检查
核对Cookie相关环境变量
SESSION_DOMAIN:跨域场景下可设置为null,无需指定具体域名SESSION_SECURE_COOKIE:必须设为true,适配生产环境HTTPS协议SESSION_HTTP_ONLY:保持默认true即可,避免前端脚本篡改Cookie
检查响应头Set-Cookie字段
用浏览器开发者工具Network面板查看注册/登录接口的响应头:- 确认Set-Cookie中
SameSite=None和Secure标记同时存在 - 若仍显示错误的SameSite值,排查环境变量是否覆盖了配置文件,或Heroku是否已重新部署生效
- 确认Set-Cookie中
确认前端请求配置
Next.js发送请求时需确保携带凭证:- 使用axios时,设置
withCredentials: true - 使用fetch时,设置
credentials: 'include'
- 使用axios时,设置
内容的提问来源于stack exchange,提问作者Joshua Galit
相关产品推荐
相关产品推荐

