AWS Amplify React应用中谷歌登录用户创建数据时Owner字段未填充
问题解决:谷歌登录后DynamoDB Owner字段未填充的修复方案
核心问题原因
社交登录用户的身份标识在Amplify自动填充Owner字段的机制中未被正确识别,而邮箱/密码登录用户的标识能被正常读取。以下是具体修复步骤:
1. 确认GraphQL模型的@auth规则配置
先检查你的GraphQL Schema,确保模型使用了默认的owner授权规则,这个规则会自动用用户的sub(唯一身份标识)填充Owner字段:
type Todo @model @auth(rules: [{ allow: owner }]) { id: ID! name: String! description: String }
如果你的schema已经是这个配置,问题大概率出在用户身份信息的传递上。
2. 验证社交登录用户的身份信息
调用Auth.currentAuthenticatedUser()获取谷歌登录用户的信息,确认sub字段存在:
import { Auth } from 'aws-amplify'; Auth.currentAuthenticatedUser().then(user => { console.log("用户sub:", user.attributes.sub); // 检查是否输出有效字符串 });
如果sub存在但Owner仍未填充,说明Amplify的自动映射逻辑有问题;如果sub不存在,需要去Cognito用户池检查谷歌身份提供者的配置是否正确。
3. 手动传递Owner字段(快速修复方案)
如果自动填充失效,可以手动在mutation中传入Owner字段:
- 首先修改Schema,显式添加Owner字段:
type Todo @model @auth(rules: [{ allow: owner }]) { id: ID! name: String! description: String Owner: String # 新增字段 } - 运行
amplify codegen重新生成API代码,之后在调用mutation时手动传入用户sub:import { Auth, API } from 'aws-amplify'; import { createTodo } from './graphql/mutations'; const createTodoItem = async (todoData) => { const user = await Auth.currentAuthenticatedUser(); return API.graphql({ query: createTodo, variables: { input: { ...todoData, Owner: user.attributes.sub } } }); };
4. 检查Cognito用户池配置
- 确认谷歌作为身份提供者已在用户池中正确配置,且应用客户端已启用该提供者;
- 检查用户池的属性映射,确保谷歌的用户标识(如sub)被正确映射到Cognito用户的
sub属性; - 更新Amplify CLI到最新版本(
npm install -g @aws-amplify/cli),旧版本可能存在社交登录的兼容bug。
内容的提问来源于stack exchange,提问作者bernieslearnings
相关产品推荐
相关产品推荐

