You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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存储方案
  • 已验证无效的尝试:
    1. 两个子域共用同一个Cognito App Client,仍无法直接跨子域传递会话
    2. 执行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:

  1. 在对应Cognito App Client的允许回调地址配置中,同时添加signup.foo.com和app.foo.com的路由地址
  2. 用户在signup.foo.com完成注册、走完邮箱/手机号验证流程后,不直接在当前域名写入长期会话,直接触发Cognito OAuth2授权码流程,重定向到app.foo.com的授权回调路由
  3. app.foo.com侧部署的Amplify Auth初始化后会自动解析URL中的一次性授权码,调用Cognito令牌端点换取属于当前域名存储上下文的完整会话数据,自动写入当前域名的localStorage,全程无手动操作token的环节,不存在凭证识别失败的问题

方案优势:流程中传递的是短有效期、一次性使用的授权码,即使被截获也无法重复使用,避免了跨域传递长期refreshToken带来的泄露风险。

方案2:服务端令牌交换(适配无法使用托管UI重定向的场景)

如果业务流程限制无法走Cognito托管UI重定向,可以通过标准OAuth2令牌交换流程实现,不需要修改Cognito底层配置:

  1. 用户在signup.foo.com完成注册拿到有效会话后,将当前会话的refreshToken通过端到端加密的接口传给自有Node中间服务
  2. Node服务侧不要使用admin-initiate-auth接口,直接调用Cognito公开的/oauth2/token端点,授权类型选refresh_token,携带App Client凭证、传入收到的refreshToken发起请求,拿到包含accessToken、refreshToken、idToken、tokenType、expiresIn在内的全量会话字段
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:48:53