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

Laravel Sanctum与Nuxt3跨域CSRF令牌不匹配419错误排查

解决Laravel Sanctum + Nuxt3 (nuxt-auth-sanctum) 跨域CSRF令牌不匹配问题

问题背景

本地环境(前端http://localhost:2765、后端http://127.0.0.1:8000)登录功能正常,但切换到线上后端https://dev.domain.de、前端http://local.domain.de:2765后,虽能获取/sanctum/csrf-cookie,但登录请求返回419「CSRF token mismatch」,且前端useCookie('XSRF-TOKEN')无法读取令牌。

关键配置修改方案

1. Laravel Sanctum 配置调整

修改config/sanctum.php中的stateful配置,避免自动拼接的后端域名干扰,直接通过环境变量控制可信域名:

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost:2765,local.domain.de:2765,admin.domain.de')),

线上环境.env文件添加:

SANCTUM_STATEFUL_DOMAINS=local.domain.de:2765,admin.domain.de

确保stateful列表包含前端完整域名(含端口),Sanctum仅信任此列表内的域名发送带Cookie的请求。

2. Laravel Session 配置调整

修改config/session.php:

'domain' => env('SESSION_DOMAIN', null),
'same_site' => env('SESSION_SAME_SITE', 'lax'),
'http_only' => env('SESSION_HTTP_ONLY', true),
'secure' => env('SESSION_SECURE_COOKIE', false),

线上环境.env设置:

SESSION_DOMAIN=.domain.de
SESSION_SAME_SITE=none
SESSION_SECURE_COOKIE=true
  • SESSION_DOMAIN=.domain.de:让所有子域名(dev.domain.de、local.domain.de)共享Cookie
  • SESSION_SAME_SITE=none:跨协议(HTTP→HTTPS)+跨子域名场景下,必须设置为none才能让浏览器携带Cookie
  • SESSION_SECURE_COOKIE=true:配合same_site=none使用,仅在HTTPS连接中发送Cookie,符合浏览器安全要求

3. 前端Nuxt3 配置检查

确保nuxt.config.ts中nuxt-auth-sanctum的配置正确:

export default defineNuxtConfig({
  modules: ['nuxt-auth-sanctum'],
  sanctum: {
    baseUrl: 'https://dev.domain.de',
    credentials: true // 开启携带Cookie
  }
})

额外注意事项

  • 彻底清除浏览器缓存和Cookie后重新测试,避免旧Cookie残留干扰
  • 若前端为HTTP、后端为HTTPS,部分浏览器会阻止跨协议Cookie携带,可临时在浏览器设置中允许「不安全内容」,或为本地前端配置HTTPS(如用mkcert生成本地证书)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:44:58