You need to enable JavaScript to run this app. React AWS Amplify身份验证用户仅存入联合身份未存入DynamoDB问题
优惠活动
大模型
产品
解决方案
定价
更多

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 写入用户数据。操作步骤如下:

    1. 执行 amplify add function 选择 Lambda 函数,触发源选择 Cognito 用户池,触发事件选择 Post Confirmation
    2. 为该 Lambda 函数配置 User 表的写入权限
    3. 在 Lambda 代码中编写逻辑,从 Cognito 事件中获取用户 sub 等属性,调用 DynamoDB SDK 写入 User 表
      该方案数据一致性更高,不受前端状态影响,适合生产环境使用。
注意事项

你的 User 模型 @auth 规则中指定了 ownerField: "userId",写入数据时 userId 字段必须赋值为 Cognito 用户的 sub 属性(不是 username 字段),否则后续的所有者权限校验会失败。


内容的提问来源于stack exchange,提问作者hellomello

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 21:45:03