Heroku部署NuxtJS+Laravel Sanctum项目登录后重定向失效且CSRF Token为null
问题排查及解决方案
1. 修正CORS配置合规性
你当前cors.php配置存在两处明显问题:
- 多余的
"Accept"=>"application/json"配置项不属于CORS配置规范,直接删除即可,避免配置解析异常 - 按照W3C标准,当
supports_credentials设为true时,allowed_origins不能使用通配符*,必须指定前端的完整域名,示例如下:
'allowed_origins' => ['https://你的Nuxt前端部署域名.herokuapp.com'],
2. 补全Sanctum状态域配置
Sanctum的stateful配置需要包含前端Nuxt应用的域名,你当前默认配置仅自动添加了后端API的域名,缺少前端域名:
- 直接在Heroku的后端环境变量中新增
SANCTUM_STATEFUL_DOMAINS,值为你的Nuxt前端域名.herokuapp.com,你的后端API域名.herokuapp.com,注意不要带http/https前缀和端口 - 无需修改
sanctum.php的代码,环境变量会覆盖默认拼接的规则
3. 补全Nuxt Auth模块配置
你当前的nuxt.config.js中缺少跨域请求带凭证的配置,导致浏览器不会保存后端返回的Cookie:
在laravelSanctum策略下新增credentials: true配置,示例如下:
auth: { strategies: { laravelSanctum: { provider: 'laravel/sanctum', url: 'https://***-api.herokuapp.com', credentials: true, // 新增这一行 // 其余原有配置保持不变 } } }
4. 校验会话相关环境变量
检查Heroku后端的环境变量配置:
SESSION_DRIVER推荐设为cookieSESSION_DOMAIN不要设置为.herokuapp.com(herokuapp.com属于公共后缀,浏览器会拒绝该级别的Cookie写入),留空或者填写后端API的完整域名即可- 确保
APP_URL填写的是后端API的完整访问地址
5. 修复VerifyCsrfToken配置
你提到VerifyCsrfToken.php内容为空,建议恢复默认配置,仅在$except属性中添加需要排除CSRF校验的路径即可:
protected $except = [ 'sanctum/csrf-cookie', // 其他需要排除的路径 ];
6. 确认登录流程正确性
确保Nuxt端的登录逻辑严格遵循Sanctum的要求:先发送GET请求到/sanctum/csrf-cookie接口,拿到CSRF Cookie后再发起登录请求,否则后端不会返回CSRF Cookie。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

