同域名多后端用户认证:如何实现跨服务共享登录状态?
核心思路:利用Cookie的Domain属性实现跨子域名共享
因为你的三个服务都属于sameDomain.io的子域名,只要正确配置Cookie的Domain参数,就能让z.sameDomain.io接收到y.sameDomain.io设置的HttpOnly Cookie,再配合共享的会话存储完成认证。
1. 调整y.sameDomain.io的Cookie配置
修改y后端设置Cookie的代码,确保Domain属性设为**.sameDomain.io**(注意开头的点),这样所有子域名服务都能读取该Cookie:
- 关键配置项示例(以Node.js/Express为例):
res.cookie('sessionId', userSessionId, { httpOnly: true, secure: true, // 生产环境必须开启HTTPS时设置 domain: '.sameDomain.io', path: '/', sameSite: 'Lax', // 根据跨域需求调整,跨域请求可设为None(需配合Secure) maxAge: 24 * 60 * 60 * 1000 // 会话有效期 }); - 注意:如果之前的Cookie没有设置Domain,浏览器会默认绑定
y.sameDomain.io,导致其他子域名无法读取,必须重新设置覆盖。
2. 让z.sameDomain.io支持Cookie读取与验证
因为z部署在AWS Lambda,需配合API Gateway完成以下配置:
- API Gateway 配置:
- 如果用REST API:在集成请求的"HTTP Headers"中添加
Cookie,确保请求的Cookie能传递到Lambda; - 如果用HTTP API:默认支持Cookie传递,但需确认CORS配置允许带凭证。
- 如果用REST API:在集成请求的"HTTP Headers"中添加
- Lambda 后端逻辑:
- 从请求的Cookie中解析出
sessionId; - 使用和
y后端完全相同的会话存储(比如Redis、DynamoDB)查询该sessionId对应的用户信息; - 验证会话有效性(是否过期、是否合法),通过则返回用户数据,否则返回未认证错误。
- 从请求的Cookie中解析出
3. 配置CORS确保前端请求能携带Cookie
前端x.sameDomain.io请求z时,必须携带凭证,同时z的CORS响应头要正确配置:
- 前端请求配置:
- 用Axios的话添加
withCredentials: true; - 用Fetch的话设置
credentials: 'include'。
- 用Axios的话添加
z后端CORS响应头:
注意:Access-Control-Allow-Origin: https://x.sameDomain.io Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: Content-TypeAccess-Control-Allow-Origin不能设为*,必须指定前端的具体域名。
4. 备选方案:JWT Token认证(若Cookie共享受限)
如果后续可能扩展到跨主域名服务,或者不想依赖会话存储,可以改用JWT:
y登录成功后,生成包含用户信息的JWT Token,同时把Token存入Domain为.sameDomain.io的HttpOnly Cookie;- 前端请求
z时,Cookie会自动携带Token,z后端用和y相同的密钥验证JWT签名,解析出用户信息; - 这种方式无需共享会话存储,JWT本身包含认证信息,适合分布式服务场景。
内容的提问来源于stack exchange,提问作者Blockchain Kid
相关产品推荐
相关产品推荐

