如何实现同AWS Cognito用户池跨不同域名应用的自动登录?
跨顶级域名AWS Cognito自动身份认证解决方案
你有两个分属不同顶级域名(www.cat.yy.com、www.dog.xx.com)的应用,共享同一AWS Cognito用户池,要实现登录其中一个后访问另一个自动完成认证,核心难点是浏览器同源策略限制跨域Cookie共享,以下是两种可行方案:
方案一:官方推荐——Cognito Hosted UI实现单点登录(SSO)
这是最简单可靠的跨域SSO方案,步骤如下:
- 在Cognito用户池的应用客户端配置中,分别为两个应用添加对应的回调URL(如
www.cat.yy.com/callback、www.dog.xx.com/callback)和退出URL,确保这些URL已在控制台中预先注册 - 两个应用的登录流程统一跳转至Cognito Hosted UI地址:
https://<你的用户池域名>.auth.<区域>.amazoncognito.com/login - 用户首次在Hosted UI完成登录后,会话Cookie会存储在Cognito Hosted UI的独立域名下;当用户访问另一个应用时,应用检测到未登录状态自动跳转至Hosted UI,此时Hosted UI会识别已存在的会话,无需重复输入账号密码,直接返回授权码给当前应用的回调URL,完成自动认证
关键配置细节:
- 两个应用必须使用同一用户池下的不同客户端ID(或同一客户端ID,推荐用不同的便于区分)
- 可在用户池应用客户端设置中调整Hosted UI的会话有效期(默认1小时)
- 如果是HTTP环境,需调整Cookie的SameSite属性为
Lax,HTTPS环境下建议设为None并开启Secure属性,避免浏览器拦截会话Cookie
方案二:自定义后端实现跨域会话同步
如果不想依赖Hosted UI,可通过自定义后端同步会话:
- 用户在www.cat.yy.com登录成功后,后端将Cognito返回的ID Token和Refresh Token存储到共享存储(如Redis),并生成一个随机唯一的会话ID
- 前端将该会话ID存储到本地(建议用HttpOnly Cookie,HTTPS环境开启Secure)
- 用户访问www.dog.xx.com时,前端携带会话ID请求后端,后端从Redis中取出对应的Cognito令牌,验证有效性后直接初始化当前应用的认证状态
- 令牌过期时,用Refresh Token自动刷新获取新令牌,保持会话同步
安全注意事项:
- 会话ID需具备高随机性,避免被伪造
- Redis中的令牌需设置与Cognito令牌一致的过期时间
- 后端需配置严格的CORS规则,仅允许yy.com和xx.com域名的跨域请求
- 前端存储会话ID时,需做好XSS防护(如输入过滤、内容安全策略)
排查要点
- Hosted UI未自动识别会话:检查Cognito用户池的会话配置,确认Cookie的SameSite和Secure属性设置正确,且浏览器未拦截第三方Cookie
- 跨域请求被拒绝:确认后端CORS配置的允许域名包含目标应用域名
- 令牌验证失败:检查应用使用的Cognito客户端ID是否正确,可通过Cognito公钥验证令牌签名有效性
内容的提问来源于stack exchange,提问作者Arokia Lijas
相关产品推荐
相关产品推荐

