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

主域与子域间会话/Cookie数据共享:跨域登录状态同步需求

跨域共享登录状态实现主域弹窗显示

核心思路

利用同根域Cookie共享 + Laravel验证接口实现主域WordPress读取子域Laravel的登录状态——主域(如example.com)和子域(如app.example.com)属于同一根域时,浏览器允许共享指定根域的Cookie,这是最直接的实现方式。


步骤1:Laravel子域配置Cookie跨域

修改Laravel的Session配置,让登录状态Cookie能被主域读取:

  1. 打开config/session.php,调整以下参数:
'domain' => '.example.com', // 前缀点表示允许所有子域和主域访问该Cookie
'secure' => env('SESSION_SECURE_COOKIE', true), // HTTPS环境必须设为true,保障安全
'same_site' => 'lax', // 允许跨域请求携带Cookie,若需跨域POST请求可改为'none'(需配合secure:true)
  1. 清理缓存使配置生效:执行命令php artisan cache:clear和php artisan config:clear。

步骤2:Laravel提供登录状态验证接口

创建无权限校验的接口,用于返回用户登录状态:

  1. 在routes/api.php中添加路由:
Route::get('/check-auth', function () {
    return response()->json([
        'authenticated' => auth()->check()
    ]);
});
  1. 配置CORS允许主域请求:
    打开config/cors.php,更新配置项:
'paths' => ['api/*'], // 包含check-auth接口路径
'allowed_origins' => ['https://example.com'], // 替换为你的WordPress主域URL
'allowed_methods' => ['GET'],
'allowed_headers' => ['*'],
'supports_credentials' => true, // 必须开启,允许请求携带跨域Cookie

步骤3:WordPress主域实现弹窗逻辑

在WordPress主题中添加前端代码,调用Laravel接口并控制弹窗显示:

  1. 添加弹窗HTML到主题模板(如header.php或footer.php):
<div id="subdomain-login-popup" style="display: none; position: fixed; z-index: 9999; top: 50%; left: 50%; transform: translate(-50%, -50%); padding: 2rem; background: #fff; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
    <p>你已在子域登录,欢迎回来!</p>
    <button onclick="document.getElementById('subdomain-login-popup').style.display='none'">关闭</button>
</div>
  1. 添加JavaScript逻辑(可放在functions.php或直接嵌入模板):
document.addEventListener('DOMContentLoaded', function() {
    fetch('https://app.example.com/api/check-auth', {
        credentials: 'include', // 关键:携带跨域Cookie
        method: 'GET'
    })
    .then(response => response.json())
    .then(data => {
        const popup = document.getElementById('subdomain-login-popup');
        data.authenticated ? popup.style.display = 'block' : popup.style.display = 'none';
    })
    .catch(error => {
        // 请求失败(如网络问题)默认隐藏弹窗
        document.getElementById('subdomain-login-popup').style.display = 'none';
    });
});

特殊场景处理

如果主域和子域非同根域(如example.com和app.another.com),Cookie方案失效,可采用以下替代方案:

  • 使用JWT令牌:Laravel登录后返回JWT,存储在主域的localStorage中,WordPress前端携带JWT调用Laravel接口验证
  • 实现OAuth2授权流程:通过授权码模式让主域获取子域的用户身份信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:18:20