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

Laravel Sanctum与Nuxt应用跨子域会话无法共享问题求助

跨子域会话共享问题:Nuxt.js + Laravel Sanctum 排查与解决

配置详情

Laravel 环境配置(.env)

会话配置

SESSION_DRIVER=database
SESSION_DOMAIN=.example.com
SESSION_SAME_SITE=none

Sanctum 配置

SANCTUM_STATEFUL_DOMAINS=example.com,dashboard.example.com,marketplace.example.com

Nuxt.js 环境配置(.env)

Axios 配置

API_ENDPOINT=https://api.example.com

Nuxt Auth 基础配置

APP_URL=https://example.com
APP_URL_DASHBOARD=https://dashboard.example.com

Nuxt Auth 策略配置

auth: {
  strategies: {
    'laravelSanctum': {
      provider: 'laravel/sanctum',
      url: process.env.API_ENDPOINT,
      endpoints: {
        login: { url: '/api/auth/login', method: 'post',  propertyName: 'token' },
        logout: { url: '/api/auth/logout', method: 'post' },
        user: { url:'/api/user', method: 'get', propertyName: false }
      }
    },
    // 其他策略...
  },
  redirect: {
    login: `${process.env.APP_URL}/auth/login`,
    logout: `${process.env.APP_URL}/auth/login`,
    callback: `${process.env.APP_URL}/auth/login`,
    home: process.env.APP_URL_DASHBOARD ?? '/'
  }
}

问题描述

用户在根域(example.com)登录后,通过this.$auth.user()可以获取已认证用户信息,但导航至dashboard.example.com等子域时,this.$auth.user()返回null,无法识别登录状态,无法实现跨子域会话共享。

解决思路

1. 确认Cookie的Secure属性

当SESSION_SAME_SITE=none时,浏览器要求Cookie必须设置Secure属性才能生效:

  • 检查Laravel的config/session.php,确保'secure' => env('SESSION_SECURE', true),或直接在.env中添加SESSION_SECURE=true。
  • 所有子域必须使用HTTPS,否则Secure Cookie无法被携带。

2. 调整Nuxt Auth的Cookie与Axios配置

在Nuxt Auth的laravelSanctum策略中,显式配置Cookie的domain属性,与Laravel的SESSION_DOMAIN保持一致:

'laravelSanctum': {
  provider: 'laravel/sanctum',
  url: process.env.API_ENDPOINT,
  cookie: {
    domain: '.example.com'
  },
  // 其余原有配置...
}

同时在nuxt.config.js中开启Axios的凭证携带:

axios: {
  withCredentials: true
}

3. 主动获取CSRF令牌

跨子域页面初始化时,先请求Sanctum的CSRF接口触发Cookie设置,再拉取用户信息:

async mounted() {
  await this.$axios.get('/sanctum/csrf-cookie')
  await this.$auth.fetchUser()
}

4. 校验Sanctum状态域配置

确保SANCTUM_STATEFUL_DOMAINS包含所有需要共享会话的子域,格式不带协议(http/https)。Laravel 8中可尝试使用通配符形式.example.com简化配置。

5. 确认会话驱动一致性

所有关联应用(Nuxt子域项目、Laravel后端)必须使用相同的会话驱动(此处为database),且会话存储的数据库连接配置一致,保证会话数据能被正确读取。

6. 清理浏览器缓存

测试前清除浏览器的缓存与相关Cookie,避免旧配置干扰新设置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:25:11