为什么我使用iam进行身份验证时无法读取关系数据,但通过cognito用户池进行身份验证时可以读取

Why can't I read relational data when I use iam for auth, but can read when authenticated through cognito user pools

我的项目使用 cognito 用户池作为默认身份验证方法,并将 iam 用于我的自定义 graphql lambda 解析器。

我一直在使用 AppSync 控制台 运行 测试我的 queries/mutations。

我在这个 schema.graphql 文件中实现了用户和组类型之间的多对多关系。


type User
  @model
  @auth(
    rules: [
      { allow: owner, ownerField: "id", operations: [create, update, delete] }
      { allow: private, provider: iam, operations: [read, update, delete] }
      { allow: private, provider: userPools, operations: [read] }
    ]
  ) {
  id: ID!
  displayName: String!
  groups: [GroupMemberLink] @connection(keyName: "byMember", fields: ["id"])
}

type Group
  @model
  @auth(
    rules: [
      { allow: owner, ownerField: "members", operations: [create, update, delete] }
      { allow: private, provider: iam, operations: [read, update, delete] }
      { allow: private, provider: userPools, operations: [read] }
    ]
  ) {
  id: ID!
  name: String!
  members: [String]!
  associated: [GroupMemberLink] @connection(keyName: "byGroup", fields: ["id"])
}

type GroupMemberLink
  @model(queries: null, subscriptions: null)
  @key(name: "byGroup", fields: ["groupID", "memberID"])
  @key(name: "byMember", fields: ["memberID", "groupID"])
  @auth(
    rules: [
      { allow: private, provider: userPools, operations: [read] }
      # what am I doing wrong below?
      { allow: private, provider: iam, operations: [create, read, update, delete] }
    ]
  ) {
  id: ID!
  groupID: ID!
  memberID: ID!
  group: Group! @connection(fields: ["groupID"])
  member: User! @connection(fields: ["memberID"])
}

我的意图:

  1. 只允许我的 lambda 函数(使用 iam)读取和执行突变 (create/update/delete)
  2. 允许使用 Cognito 用户池进行身份验证的用户只能读取。

我的问题:

当我从用户或组类型查询时,我的 lambda 函数无法读取此关系 type/field。用户似乎也能够创建这种类型的对象,这是我绝对不想要的。

我做错了什么?我知道最近添加了多重身份验证,所以这可能很棘手。

阅读文档对我帮助不大,所以我一直在尝试许多不同的规则组合,希望其中一个能奏效。

更新:每当我尝试访问用户或组类型上的连接字段时,我都会收到此错误:Not Authorized to access items on type ModelGroupMemberLinkConnection" 从 Appsync 控制台使用 iam 作为身份验证类型。

澄清一下:使用 Cognito 用户池进行身份验证的用户同时具有 read/write 访问权限(不应具有写入权限),但我使用 iam 的 lambda 函数没有读取或写入权限。

我尝试过的事情仍然导致在使用 iam 进行身份验证时无法访问相关字段:

  1. 完全删除 auth 指令。
  2. 将 GroupMemberLink 中的授权规则更改为 @auth(rules: [{ allow: private, provider: iam, operations: [read, update, delete] }])

更新:

这些是我一直在 AppSync 控制台中测试的查询:

query GetUser {
  getUser(id: "funksouldev") {
    id
    displayName
    groups {
      items {
        group {
          id
          name
        }
      }
    }
  }
}

query GetGroup($groupID: ID!) {
  getGroup(id: $groupID) {
    id
    associated {
      items {
        id
        member {
          id
          displayName
        }
      }
    }
  }
}

好的,最后我认为这可以解决问题。

type ModelGroupMemberLinkConnection @aws_iam
@aws_cognito_user_pools
   {
    items: [GroupMemberLink]
    nextToken: String
   }