基于Node.js与AWS Cognito实现多域SSO的跨站自动登录问题
解决AWS Cognito多域名SSO跨域自动登录问题
以下是针对你的Node.js多域名项目中Cognito SSO跨域自动登录失效问题的排查和解决步骤:
1. 检查Cognito自定义域名配置
- 必须使用Cognito自定义域名(而非默认的
auth.region.amazoncognito.com),默认域名的Cookie绑定在Amazon域名下,无法跨你的业务域名共享。 - 配置自定义域名时,使用AWS ACM的通配符SSL证书(如
*.yourdomain.com),且证书必须部署在us-east-1区域(Cognito前端托管资源要求),确保覆盖所有子域名(website1、website2等)。
2. 修正Cookie存储设置
在Cognito用户池的App客户端设置中调整Cookie参数:
- 将
Cookie Storage的Domain设置为你的根域名(如.yourdomain.com,注意前缀的点,允许所有子域名共享Cookie)。 - 根据环境配置
Cookie Attributes:- 生产环境强制开启
Secure(仅HTTPS传输),本地开发可关闭; SameSite设为None(跨域场景必需,需配合Secure);HttpOnly建议开启(防止XSS攻击,若前端无需直接读取Token则保持开启)。
- 生产环境强制开启
3. 统一App客户端配置
- 所有网站(website1~website3)需使用同一个Cognito App客户端,或不同客户端但确保以下配置一致:
- 在用户池的App客户端中添加所有网站的回调URL(如
https://website1.yourdomain.com/callback)和登出URL; - 开启
Authorization code grantOAuth流(SSO场景最安全的模式); - 至少勾选
openid、profile、email这几个OAuth Scope(身份认证必需)。
- 在用户池的App客户端中添加所有网站的回调URL(如
4. Node.js后端的跨域与认证处理
- 使用官方
@aws-sdk/client-cognito-identity-provider或amazon-cognito-identity-js库处理认证逻辑,避免手动解析Token。 - 配置CORS策略:
- 设置
Access-Control-Allow-Origin为对应子域名(生产环境建议动态匹配,避免通配符); - 开启
Access-Control-Allow-Credentials: true,确保浏览器跨域请求时携带Cookie。
- 设置
- 当用户访问其他网站时,后端自动检测请求中的Cognito Cookie,调用
VerifyToken或GetUser接口验证身份,无需用户重复登录。
5. 前端跳转逻辑优化
- 所有网站的登录入口统一指向Cognito授权端点:
https://your-custom-cognito-domain/oauth2/authorize,请求参数需包含对应网站的redirect_uri、client_id、response_type=code、scope=openid profile email。 - 用户已登录状态下访问新网站时,前端直接跳转至该授权端点,Cognito会自动识别已有Cookie,返回授权码至目标网站的回调地址,后端完成Token兑换后自动登录。
调试技巧
- 用浏览器开发者工具(Application → Cookies)检查根域名下是否存在Cognito相关Cookie,确认Domain、Secure、SameSite参数符合配置。
- 查看Cognito的CloudWatch日志,排查授权流程中是否存在回调URL不匹配、Scope缺失等错误。
内容的提问来源于stack exchange,提问作者Rishab test
相关产品推荐
相关产品推荐

