使用Amplify + Cognito鉴权时如何在DynamoDB中关联Cognito用户?
Cognito与DynamoDB用户关联标准实现方案
核心关联逻辑选择Cognito用户的sub字段作为唯一主键,这是Cognito为每个用户生成的全局唯一、永久不可变的标识符,是该场景下的最优关联键,不存在用户名、邮箱、手机号这类可修改字段后续匹配失效的问题。你可以在前端通过Auth.currentAuthenticatedUser()获取当前用户的sub,后端可以解析Cognito签发的JWT payload直接拿到sub,不需要额外调用Cognito接口查询。
根据你的技术栈(已使用Amplify),优先推荐第一种实现路径:
路径1:Amplify原生自动关联(最适配当前技术栈,无需额外开发)
直接在Amplify的GraphQL schema中配置@auth规则即可实现自动关联、自动权限控制,示例schema代码如下:
type User @model @auth(rules: [{ allow: owner, ownerField: "id", identityClaim: "sub" }]) { id: ID! # Amplify会自动将该字段映射为Cognito用户的sub值,无需手动赋值 nickname: String avatarUrl: String # 按需添加其他需要存储的自定义用户字段 }
- 配置完成后执行
amplify push,Amplify会自动创建对应的DynamoDB用户表 - 默认会在用户首次登录时自动初始化用户记录,同时自动配置权限规则,每个用户仅能读写自己的用户数据,无需手动配置IAM策略
- 前端直接调用Amplify的API客户端即可读写当前用户的信息,不需要手动传递用户标识
路径2:自定义实现(适合需要灵活控制逻辑的场景)
如果你需要自行控制整个流程,可按以下步骤实现:
- 新建DynamoDB用户表,设置主键为
userId(字符串类型),值存储对应Cognito用户的sub - 配置Cognito后置确认触发器(Post Confirmation Lambda Trigger),用户完成注册、邮箱验证后自动触发Lambda函数,在DynamoDB中初始化对应用户的空记录,避免前端逻辑遗漏创建记录
- 为调用端配置IAM权限策略,仅允许用户访问主键等于自身
sub的记录,示例策略片段如下:
{ "Effect": "Allow", "Action": ["dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem"], "Resource": "arn:aws:dynamodb:<你的AWS区域>:<你的AWS账号ID>:table/<你的用户表名>", "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"] } } }
注意:禁止使用用户名、邮箱、手机号等可修改字段作为关联键,也不要自行生成随机ID做关联,会额外增加一致性问题的风险。
内容的提问来源于stack exchange,提问作者Robert Slippey
相关产品推荐
相关产品推荐

