如何基于NuxtJs与Laravel Sanctum实现跨子域会话状态识别及自动跳转
解决Nuxt + Laravel Sanctum多子域下Auth状态共享与自动重定向问题
我之前在开发多子域的Nuxt+Sanctum项目时,遇到过和你完全一致的问题——跨子域无法共享登录状态,导致connexion子域没法识别用户是否在其他子域已登录。核心原因是浏览器默认会隔离不同子域的Cookie和Auth会话,下面是我验证过的完整解决方案:
1. 配置Laravel后端支持跨子域Cookie共享
首先要让Laravel的Session和Sanctum Cookie能被所有子域识别:
- 修改
.env文件,设置会话域为根域(前面加.表示所有子域):SESSION_DOMAIN=.testingdomain.com SANCTUM_STATEFUL_DOMAINS=testingdomain.com,myfirstdomain.testingdomain.com,myotherdomain.testingdomain.com,connexion.testingdomain.com - 同步修改
config/sanctum.php的stateful数组,确保包含所有子域:'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', '')), - 再修改
config/session.php的domain配置:'domain' => env('SESSION_DOMAIN', '.testingdomain.com'),
2. 配置Nuxt Auth模块跨域Cookie
接下来要让Nuxt的Auth模块和Axios能跨子域读取共享Cookie:
- 在
nuxt.config.js的auth配置中,指定Cookie的根域:export default { // ...其他配置 auth: { strategies: { laravelSanctum: { provider: 'laravel/sanctum', url: 'https://testingdomain.com', // 你的Laravel后端地址 cookie: { domain: '.testingdomain.com' } } }, cookie: { domain: '.testingdomain.com' } }, axios: { baseURL: 'https://testingdomain.com/api', withCredentials: true // 关键:允许携带跨域Cookie } }
3. 实现connexion子域的自动重定向逻辑
现在Cookie已经能跨子域共享了,接下来在connexion子域添加重定向逻辑:
- 在connexion子域的首页(比如
pages/index.vue)中,在页面加载时检查登录状态,并请求后端获取用户所属的企业子域:async mounted() { // 先检查本地Auth状态 if (this.$auth.loggedIn) { try { // 调用后端接口获取用户对应的企业子域 const { data } = await this.$axios.get('/api/user-company-domain') if (data.domain) { // 重定向到用户已登录的子域 window.location.href = `https://${data.domain}.testingdomain.com` } } catch (error) { // 如果接口报错(比如会话过期),则登出 await this.$auth.logout() } } } - 在Laravel后端添加对应的接口,返回当前登录用户的企业子域:
// routes/api.php use Illuminate\Support\Facades\Auth; Route::get('/user-company-domain', function () { // 假设用户关联的企业模型有subdomain字段 $subdomain = Auth::user()->company->subdomain; return response()->json(['domain' => $subdomain]); })->middleware('auth:sanctum');
4. 关键注意事项
- 必须使用HTTPS:现代浏览器对跨域Cookie的限制很严格,HTTP环境下SameSite属性的Cookie可能无法正常共享,建议所有子域都配置HTTPS。
- 清除旧Cookie:测试前务必清除浏览器中与
testingdomain.com相关的所有旧Cookie,避免旧配置干扰。 - SameSite属性设置:如果遇到跨域Cookie仍无法共享的情况,可以在
config/session.php中将same_site设置为lax(默认)或none(需要配合secure: true):'same_site' => 'lax', 'secure' => env('SESSION_SECURE_COOKIE', true),
内容的提问来源于stack exchange,提问作者Miguel
相关产品推荐
相关产品推荐

