如何使用 AppSync GraphQL 转换为一对多 @connection 执行 @auth?

Posted

技术标签:

【中文标题】如何使用 AppSync GraphQL 转换为一对多 @connection 执行 @auth?【英文标题】:How to do @auth for one-to-many @connection with AppSync GraphQL Transform? 【发布时间】:2020-07-14 07:31:33 【问题描述】:

我的问题与这个问题非常相似:How to do field level @auth for bi-directional one-to-many @connection with AppSync GraphQL Transform?。我会用一个稍微不同的 graphql 模式来询问,并希望得到一个更普遍的答案。示例架构是:

type Blog @model @auth(rules: [ allow: owner ,  allow: public, operations: [read] ]) 
    id: ID!   
    name: String!
    posts: [Post] @connection 

type Post @model @auth(rules: [ allow: owner ,  allow: public, operations: [read] ])   
    title: String!
    bodyText: String!

假设用户名为“User1”的用户创建了一个博客项目。此数据库条目最终为

Blog:  owner: "User1", id: "0b7f6862-1a46-4006-8953-e440334c47ec", name: "My First Blog!" 

现在 User2 知道了 User1 的博客的 id -> 即“0b7f6862-1a46-4006-8953-e440334c47ec”。该用户使用

运行 createPost 突变
input:   postBlogId: "0b7f6862-1a46-4006-8953-e440334c47ec", title: "I'm User1 and I Hate Puppies!", bodyText: "Puppies should be illegal!" 

这行得通!用户 2 已经注入了一个帖子,该帖子将在连接到帖子时出现在用户 1 的博客的查询中。这似乎很糟糕。

另一个问题中接受的解决方案似乎依赖于表中的 id 字段,该字段是“一对多”连接关系中的“一”字段,恰好兼作所有者字段。但是这个问题似乎存在于任何一对多的连接中,其中大多数都没有这种约束。

人们找到保护它的方法了吗?我同意另一个问题,这似乎是每个人都必须打的。

我想在 id 字段上添加字段级别身份验证以将其限制为仅允许所有者读取以及提供给其他用户以运行 Gets 的辅助 id 密钥,但在 id 等必填字段上执行字段级别身份验证会中断订阅.我能想到的唯一另一种方法是在“一对多”连接关系的“多”端阻止任何类型的创建和更新,然后添加在可以查询的服务器上运行 lambdas 的自定义突变另一个表来验证用户是否具有建立连接的权限。但是,如果您必须这样做,似乎放大文档会在某处提到它?真的很感激被告知我错过了一些愚蠢的事情。

【问题讨论】:

【参考方案1】:

显然这是How to check permissions of an entity on create in appsync的副本 自动执行此操作的 RFC 仍处于开放状态,并且一年内没有更新。 https://github.com/aws-amplify/amplify-cli/issues/1055

【讨论】:

以上是关于如何使用 AppSync GraphQL 转换为一对多 @connection 执行 @auth?的主要内容,如果未能解决你的问题,请参考以下文章

使用 GraphQL 转换在 AWS AppSync 中生成带有参数的订阅

通过 AWS AppSync GraphQL API 使用多种授权类型

如何使用 AWS appsync (GraphQL) 禁用自省查询?

如何使用 amplify 将 GraphQL 更改从 Appsync 同步到 Android?

AppSync/Amplify - 如何定义 GraphQL 订阅

如何在 AppSync GraphQL 架构中使用自定义输入类型?