为什么我使用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"])
}
我的意图:
- 只允许我的 lambda 函数(使用 iam)读取和执行突变 (create/update/delete)
- 允许使用 Cognito 用户池进行身份验证的用户只能读取。
我的问题:
当我从用户或组类型查询时,我的 lambda 函数无法读取此关系 type/field。用户似乎也能够创建这种类型的对象,这是我绝对不想要的。
我做错了什么?我知道最近添加了多重身份验证,所以这可能很棘手。
阅读文档对我帮助不大,所以我一直在尝试许多不同的规则组合,希望其中一个能奏效。
更新:每当我尝试访问用户或组类型上的连接字段时,我都会收到此错误:Not Authorized to access items on type ModelGroupMemberLinkConnection"
从 Appsync 控制台使用 iam 作为身份验证类型。
澄清一下:使用 Cognito 用户池进行身份验证的用户同时具有 read/write 访问权限(不应具有写入权限),但我使用 iam 的 lambda 函数没有读取或写入权限。
我尝试过的事情仍然导致在使用 iam 进行身份验证时无法访问相关字段:
- 完全删除 auth 指令。
- 将 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
}
我的项目使用 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"])
}
我的意图:
- 只允许我的 lambda 函数(使用 iam)读取和执行突变 (create/update/delete)
- 允许使用 Cognito 用户池进行身份验证的用户只能读取。
我的问题:
当我从用户或组类型查询时,我的 lambda 函数无法读取此关系 type/field。用户似乎也能够创建这种类型的对象,这是我绝对不想要的。
我做错了什么?我知道最近添加了多重身份验证,所以这可能很棘手。
阅读文档对我帮助不大,所以我一直在尝试许多不同的规则组合,希望其中一个能奏效。
更新:每当我尝试访问用户或组类型上的连接字段时,我都会收到此错误:Not Authorized to access items on type ModelGroupMemberLinkConnection"
从 Appsync 控制台使用 iam 作为身份验证类型。
澄清一下:使用 Cognito 用户池进行身份验证的用户同时具有 read/write 访问权限(不应具有写入权限),但我使用 iam 的 lambda 函数没有读取或写入权限。
我尝试过的事情仍然导致在使用 iam 进行身份验证时无法访问相关字段:
- 完全删除 auth 指令。
- 将 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
}