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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:36:16