如何结合AWS Marketplace注册令牌与AWS Cognito ID令牌关联同一用户?
解决AWS Marketplace与Cognito用户关联的问题
核心思路是用你应用的唯一标识符(邮箱)作为中间纽带,把Marketplace的CustomerIdentifier和Cognito认证用户绑定起来,具体步骤和细节如下:
1. 首次用户流程:完成绑定
当用户第一次从Marketplace跳转过来(带注册令牌):
- 先调用
resolveCustomer()拿到CustomerIdentifier和产品代码,再调用getEntitlements()获取权限、过期时间这些数据 - 不要直接退出启动Cognito UI,而是把这些Marketplace数据临时存起来:
- 可选方案1:后端用加密Cookie或者Redis缓存存这些数据,关联一个临时会话ID
- 可选方案2:跳转Cognito托管UI时,把加密后的
CustomerIdentifier和产品代码塞进state参数里(注意state要短,必须加密,别泄露敏感信息)
- 用户在Cognito填完邮箱密码认证后,会跳回你的应用,此时你能拿到Cognito的ID Token
- 解码并验证ID Token的合法性,从中提取
email字段(这是你应用的用户标识符) - 把邮箱、
CustomerIdentifier、产品代码、权限信息一起写入RDS,完成两者的绑定
2. 后续用户流程:直接关联数据
当用户后续通过Cognito认证返回应用(没有Marketplace注册令牌):
- 解码并验证Cognito ID Token,提取
email字段 - 用这个邮箱去RDS里查,直接拿到对应的
CustomerIdentifier、权限和过期时间,不用再走Marketplace的resolveCustomer()流程
3. 关键细节
- 别用CustomerIdentifier直接关联Cognito用户池:Cognito用户池的唯一用户ID是
sub字段,但你的应用用邮箱做标识符,所以用邮箱做中间关联更贴合你的业务逻辑 - ID Token解析不用调用API:后端直接解码ID Token(一定要先验证签名、过期时间、受众这些合法性),就能拿到
email字段,示例解码后的结构:{ "email": "user@example.com", "sub": "abc123-def456-ghi789", "exp": 1718923456 } - 临时数据要安全:用
state传数据必须加密;用缓存的话设置短过期时间(比如15分钟),避免无效数据占资源
4. 异常处理
- 如果用户首次认证后,RDS里查不到邮箱对应的Marketplace数据,大概率是临时数据丢了,直接引导用户重新从Marketplace进入应用,重新走
resolveCustomer()流程就行 - 一定要严格验证Cognito ID Token的合法性,防止伪造令牌导致的安全问题
内容的提问来源于stack exchange,提问作者richie
相关产品推荐
相关产品推荐

