Laravel多应用自动单点登录(SSO)实现方案咨询
跨子域SSO自动登录实现方案
要实现主域名main.com登录后,子域名A.main.com、B.main.com自动登录,核心是利用跨子域Cookie共享+统一身份验证逻辑,以下是具体实现步骤和注意事项:
核心逻辑
将登录态Cookie的domain属性设为父域名.main.com,这样所有子域名都能读取该Cookie;后端通过统一的身份验证机制校验Cookie中的凭证,完成自动登录。
1. 配置跨子域登录Cookie
用户在main.com登录成功后,后端设置Cookie时必须指定domain为.main.com(注意前缀的点),同时配置必要的安全属性:
path: '/':确保所有路径都能访问该CookiehttpOnly: true:防止XSS攻击窃取Cookiesecure: true:仅在HTTPS环境下传输Cookie(生产环境强制开启)sameSite: 'Lax':平衡安全性和可用性,适配大多数场景
示例代码(Node.js/Express):
res.cookie('auth_token', userAuthToken, { domain: '.main.com', path: '/', httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'Lax', maxAge: 7 * 24 * 60 * 60 * 1000 // 7天有效期 });
2. 子域名的身份验证流程
A.main.com和B.main.com的后端服务需要做以下处理:
- 接收请求时,提取Cookie中的
auth_token - 通过统一的验证机制(如调用主域名的验证接口、查询共享数据库/Redis)校验token的有效性和过期时间
- 验证通过后,自动为用户创建本地会话(或直接用token维持登录状态),返回已登录页面
3. 统一用户数据存储
主域名和所有子域名的后端必须共享用户身份数据:
- 可以使用同一个Redis实例存储会话token与用户信息的映射
- 或共用同一套数据库存储用户账号数据,确保验证逻辑一致性
4. 同步注销流程
当用户在main.com注销时,后端需要:
- 清除
.main.com域下的auth_tokenCookie - (可选)调用子域名的注销接口,清除子域名的本地会话(如果有),确保全域名登出
关键注意事项
- 强制HTTPS:
Secure属性的Cookie仅在HTTPS下生效,生产环境必须启用HTTPS,避免Cookie明文传输被窃取 - Cookie安全属性:
HttpOnly和Secure是必选项,能大幅降低XSS和中间人攻击风险 - 跨域请求凭证:如果前端从子域名调用主域名接口,需在AJAX请求中设置
withCredentials: true,同时后端配置CORS允许携带凭证(Access-Control-Allow-Credentials: true) - 避免敏感数据:Cookie中仅存储加密的身份凭证(如JWT、会话ID),绝对不能存放密码、手机号等敏感信息
内容的提问来源于stack exchange,提问作者Abhi shetty
相关产品推荐
相关产品推荐

