Laravel Sanctum跨IP部署:Nuxt登录CSRF令牌不匹配错误求助
Nuxt + Laravel Sanctum 跨域CSRF令牌不匹配问题解决办法
1. 核对CORS配置与环境变量
- 确认后端
.env里的FRONTEND_URL是完整的前端地址:https://127.0.0.11(必须带HTTPS协议,端口非默认时也要加上,比如https://127.0.0.11:3000) - 测试阶段可直接在
config/cors.php的allowed_origins里硬编码前端地址,排除环境变量读取问题:'allowed_origins' => ['https://127.0.0.11'],
2. 配置Sanctum的可信状态域
- 打开
config/sanctum.php,修改stateful项,把前端IP加入:'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.11')), - 或直接在
.env里设置:SANCTUM_STATEFUL_DOMAINS=127.0.0.11(此处无需带协议)
3. 调整Nuxt的请求配置
- 若使用Nuxt 2 + @nuxtjs/axios,在
nuxt.config.js中开启凭证携带:export default { modules: ['@nuxtjs/axios'], axios: { baseURL: 'https://127.0.0.10', credentials: true // 关键:确保请求携带Cookie } } - 若使用Nuxt 3,调用
useFetch/$fetch时必须添加credentials: 'include',且需先请求CSRF接口再发送登录请求:const login = async () => { const { $fetch } = useNuxtApp() // 先获取CSRF Cookie await $fetch('/sanctum/csrf-cookie', { credentials: 'include' }) // 再发送登录请求 await $fetch('/login', { method: 'POST', body: { email: 'xxx@xx.com', password: 'xxx' }, credentials: 'include' }) }
4. 检查Session配置
- 打开
config/session.php,确保domain项未硬编码localhost,建议设为null让系统自动适配:'domain' => env('SESSION_DOMAIN', null),
5. 清理缓存
- 后端执行缓存清理命令,确保配置生效:
php artisan config:clear php artisan cache:clear - 同时清除浏览器缓存和Cookie,避免旧CSRF令牌残留干扰
内容的提问来源于stack exchange,提问作者Enis Del Mar
相关产品推荐
相关产品推荐

