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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:59:05