React AWS Amplify身份验证用户仅存入联合身份未存入DynamoDB问题
问题根因
Amplify 的 Authentication 模块(基于 Cognito 用户池)和你用 @model 注解生成的 GraphQL 数据库资源是两个完全独立的服务,不存在默认的自动数据同步逻辑。你定义的 User 类型仅用于生成对应的 DynamoDB 表结构、基础 CRUD API 和权限规则,不会在用户完成 Cognito 注册流程时自动向表中插入数据。
可选解决方案
方案1:前端侧触发数据写入
实现逻辑:在用户首次登录成功后,主动调用 GraphQL 接口校验该用户是否已存在于 User 表,不存在则新增对应记录。参考代码如下:import { API, graphqlOperation } from 'aws-amplify' import { createUser } from './graphql/mutations' import { getUser } from './graphql/queries' // 放到你获取到当前登录用户的逻辑之后 useEffect(() => { Auth.currentAuthenticatedUser() .then(async (user) => { console.log("User: ", user); setUser(user); // 校验用户是否已在DynamoDB的User表中 const { data } = await API.graphql(graphqlOperation(getUser, { userId: user.attributes.sub })) if (!data.getUser) { // 不存在则创建新用户记录 await API.graphql(graphqlOperation(createUser, { input: { userId: user.attributes.sub, // 可补充其他你需要存储的用户属性 createdAt: new Date().toISOString() } })) } }) .catch((err) => setUser(null)); }, []);该方案实现成本低,适合小型项目;缺点是如果用户首次登录时前端网络异常,会出现数据漏写的情况。
方案2:后端触发器自动写入
实现逻辑:通过 Amplify CLI 为 Cognito 添加** Post Confirmation 触发器**,用户完成注册确认后自动触发 Lambda 函数向 DynamoDB 写入用户数据。操作步骤如下:- 执行
amplify add function选择 Lambda 函数,触发源选择 Cognito 用户池,触发事件选择 Post Confirmation - 为该 Lambda 函数配置 User 表的写入权限
- 在 Lambda 代码中编写逻辑,从 Cognito 事件中获取用户
sub等属性,调用 DynamoDB SDK 写入 User 表
该方案数据一致性更高,不受前端状态影响,适合生产环境使用。
- 执行
注意事项
你的 User 模型 @auth 规则中指定了 ownerField: "userId",写入数据时 userId 字段必须赋值为 Cognito 用户的 sub 属性(不是 username 字段),否则后续的所有者权限校验会失败。
内容的提问来源于stack exchange,提问作者hellomello
相关产品推荐
相关产品推荐

