NearAI项目中的跨子域名认证会话共享方案
在Web应用开发中,提供无缝的用户认证体验是提升产品可用性的关键因素之一。本文将以NearAI项目为例,探讨如何实现主域名与子域名间的认证会话共享,解决用户在app.near.ai和service.near.ai之间切换时需要重复登录的问题。
问题背景
现代Web应用常常采用微前端架构,将不同功能模块部署在不同的子域名下。NearAI项目就采用了这种模式,将核心应用部署在app.near.ai,交互功能部署在service.near.ai。然而,这种架构带来了一个常见的用户体验问题:用户在app.near.ai登录后,访问service.near.ai时会被要求重新登录。
技术分析
当前实现中,认证令牌(auth token)被存储在浏览器的localStorage中。这种存储方式存在两个主要限制:
- localStorage的作用域仅限于当前域名,无法在不同子域名间共享
- localStorage容易被XSS攻击窃取,安全性较低
解决方案
基于Cookie的会话共享
更优的解决方案是使用Cookie来存储认证令牌,具体实现要点如下:
-
Cookie属性配置:
- 设置
Domain=near.ai:使Cookie可在所有子域名(.near.ai)下访问 Secure:仅通过HTTPS传输HttpOnly:防止JavaScript访问,增强安全性- 适当的
SameSite策略:平衡安全性与功能需求
- 设置
-
Next.js中间件实现:
- 在Next.js中间件层处理认证逻辑
- 从请求中读取Cookie,验证会话有效性
- 无效或缺失的会话重定向到认证服务
-
认证流程优化:
- 用户首次登录时,auth.near.ai设置根域名Cookie
- 所有子域名应用共享同一会话状态
- 登出时清除根域名Cookie
安全考虑
实施此方案时需特别注意以下安全因素:
- CSRF防护:虽然HttpOnly Cookie降低了XSS风险,但需要额外措施防范CSRF攻击
- 令牌有效期:设置合理的过期时间,考虑实现滑动过期
- 敏感操作验证:关键操作需进行二次认证
- CORS策略:严格配置跨域资源共享策略
实现建议
对于NearAI项目的具体实现,建议采用以下步骤:
- 修改认证服务(auth.near.ai)的令牌发放逻辑,改为设置根域名Cookie
- 在所有子域名应用中移除localStorage令牌存储逻辑
- 在Next.js中间件中添加会话验证逻辑
- 实现统一的登出端点,清除所有相关Cookie
- 添加适当的监控和日志,跟踪认证流程
总结
通过将认证令牌从localStorage迁移到根域名的HttpOnly Cookie,可以显著提升NearAI项目的用户体验和安全性。这种方案不仅解决了跨子域名会话共享的问题,还遵循了现代Web应用安全最佳实践。对于采用类似架构的项目,此方案具有很好的参考价值。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



