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)共享CookieSESSION_SAME_SITE=none:跨协议(HTTP→HTTPS)+跨子域名场景下,必须设置为none才能让浏览器携带CookieSESSION_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
相关产品推荐
相关产品推荐

