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
相关产品推荐
相关产品推荐

