主域与子域间会话/Cookie数据共享:跨域登录状态同步需求
跨域共享登录状态实现主域弹窗显示
核心思路
利用同根域Cookie共享 + Laravel验证接口实现主域WordPress读取子域Laravel的登录状态——主域(如example.com)和子域(如app.example.com)属于同一根域时,浏览器允许共享指定根域的Cookie,这是最直接的实现方式。
步骤1:Laravel子域配置Cookie跨域
修改Laravel的Session配置,让登录状态Cookie能被主域读取:
- 打开
config/session.php,调整以下参数:
'domain' => '.example.com', // 前缀点表示允许所有子域和主域访问该Cookie 'secure' => env('SESSION_SECURE_COOKIE', true), // HTTPS环境必须设为true,保障安全 'same_site' => 'lax', // 允许跨域请求携带Cookie,若需跨域POST请求可改为'none'(需配合secure:true)
- 清理缓存使配置生效:执行命令
php artisan cache:clear和php artisan config:clear。
步骤2:Laravel提供登录状态验证接口
创建无权限校验的接口,用于返回用户登录状态:
- 在
routes/api.php中添加路由:
Route::get('/check-auth', function () { return response()->json([ 'authenticated' => auth()->check() ]); });
- 配置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接口并控制弹窗显示:
- 添加弹窗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>
- 添加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
相关产品推荐
相关产品推荐

