Cognito如何使用子域A的refreshToken为子域B实现身份认证
Cognito + Amplify Auth 跨子域localStorage会话共享实现方案
问题背景
- 业务基于Amplify/Auth对接Cognito实现用户注册流程,用户在
signup.foo.com完成注册后需重定向至app.foo.com的仪表盘页面 - 初始方案使用localStorage存储会话,会话被绑定至
signup.foo.com域名,无法被app.foo.com跨子域访问 - 迭代方案改用作用域为
*.foo.com的cookieStorage实现跨域会话共享,功能正常但在移动Webview场景下存在Cookie异常丢失问题,因此计划回退至localStorage存储方案 - 已验证无效的尝试:
- 两个子域共用同一个Cognito App Client,仍无法直接跨子域传递会话
- 执行
aws cognito-idp admin-initiate-auth命令,用注册会话的refreshToken成功换取新accessToken后,按照猜测的键名将refreshToken、accessToken手动注入app.foo.com的localStorage,Auth模块无法识别注入的凭证,初步推测refreshToken哈希绑定了原始域名信息
- 核心诉求:寻找官方支持的实现方式,通过Node服务结合有效的refreshToken或JWT令牌,生成可在
app.foo.com注入使用的有效认证令牌
核心结论
首先纠正之前的错误判断:Cognito签发的refreshToken本身没有绑定域名信息,手动注入凭证失败的根因是Amplify Auth在localStorage中存储的不是裸token值,而是包含token类型、有效期、时钟偏移、设备标识在内的一整套结构化会话数据,仅注入裸token会因为缺少校验必需的元数据,被Auth模块判定为无效会话。
官方支持的可行实现路径
方案1:OAuth2授权码重定向(优先推荐,安全等级最高)
这是Cognito官方原生支持的跨应用会话传递方案,完全符合OAuth2安全规范,不需要手动处理token:
- 在对应Cognito App Client的允许回调地址配置中,同时添加
signup.foo.com和app.foo.com的路由地址 - 用户在
signup.foo.com完成注册、走完邮箱/手机号验证流程后,不直接在当前域名写入长期会话,直接触发Cognito OAuth2授权码流程,重定向到app.foo.com的授权回调路由 app.foo.com侧部署的Amplify Auth初始化后会自动解析URL中的一次性授权码,调用Cognito令牌端点换取属于当前域名存储上下文的完整会话数据,自动写入当前域名的localStorage,全程无手动操作token的环节,不存在凭证识别失败的问题
方案优势:流程中传递的是短有效期、一次性使用的授权码,即使被截获也无法重复使用,避免了跨域传递长期refreshToken带来的泄露风险。
方案2:服务端令牌交换(适配无法使用托管UI重定向的场景)
如果业务流程限制无法走Cognito托管UI重定向,可以通过标准OAuth2令牌交换流程实现,不需要修改Cognito底层配置:
- 用户在
signup.foo.com完成注册拿到有效会话后,将当前会话的refreshToken通过端到端加密的接口传给自有Node中间服务 - Node服务侧不要使用
admin-initiate-auth接口,直接调用Cognito公开的/oauth2/token端点,授权类型选refresh_token,携带App Client凭证、传入收到的refreshToken发起请求,拿到包含accessToken、refreshToken、idToken、tokenType、expiresIn在内的全量会话字段 - Node服务将全量会话数据通过一次性、有效期不超过10秒的加密接口返回给
app.foo.com,前端调用Amplify Auth暴露的会话存储API,将全量字段按照Amplify要求的结构写入localStorage,不要只单独存储三个裸token,Auth模块即可正常识别凭证
避坑提示:手动写入时必须同步存储接口返回的时钟偏移、token过期时间戳等元数据字段,Amplify每次读取会话时会先校验这些字段的有效性,缺项就会判定会话无效。
不推荐的尝试方向
不要尝试修改JWT内的域名相关字段,Cognito签发的所有JWT都带官方签名,篡改内容会直接导致验签失败,没有绕过空间。如果后续考虑继续优化cookieStorage方案适配移动Webview,可以尝试将Cookie SameSite属性设置为Lax、非HTTPS调试环境关闭Secure强制校验、调整Cookie存储路径适配Webview的存储隔离规则,但整体稳定性仍低于上述两种localStorage实现方案。
内容的提问来源于stack exchange,提问作者Mattijs
相关产品推荐
相关产品推荐

