AppSync GraphQL 订阅以分组数据

Posted

技术标签:

【中文标题】AppSync GraphQL 订阅以分组数据【英文标题】:AppSync GraphQL Subscription to group data 【发布时间】:2018-10-20 03:50:47 【问题描述】:

我已经为我的 GraphQL 查询和突变实现了 AWS Lambda 授权层,这样用户只能在特定 DynamoDB 表项目中读取/写入数据,前提是他们是项目所属组的成员,使用实现groupId 分区键和 itemId 的排序键。这样表就可以有许多具有共同 groupId 的 itemId,也可以有许多不同的 groupId。这一切都按预期工作。

现在我希望能够将此组授权扩展到我的实时 GraphQL 订阅。我观察到未参数化的订阅向所有用户广播。我需要一个限制订阅事件的解决方案,以便所有组成员和只有组成员接收订阅事件,以便对包含相应 groupID 键的表数据进行突变。作为多个组的成员的用户将收到他们所属的所有组的订阅事件。

组和组成员是动态的,通过应用程序业务逻辑创建组和添加成员。

我观察了多种 AWS 授权技术,包括静态的和动态的。我已经看到了参数化订阅和订阅解析器的示例,它们仅针对一项订阅,但我所看到的没有任何东西符合我特定的“多组”需求。

我正在使用 AWS Amplify API 进行客户端 GraphQL 调用。我观察到 Apollo 有一个 subscribeToMore() 可能对这种情况有所帮助,但我目前更愿意远离返工,以使我的 UI 适合 Apollo 2 的 Render Props 模式。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您可以执行以下操作以使用 AppSync 启用此用例。

    为您的订阅添加“groupId”参数。 将订阅解析程序附加到您的订阅。 在订阅解析器的请求映射模板中,查询用户表以确定调用者有权访问哪些组。 在订阅响应映射模板中,将订阅“groupId”参数与您从用户表查询中检索到的组列表进行交叉检查。如果呼叫者尝试订阅他们未获得授权的组,请拒绝该请求。 确保您的变更返回 groupId 字段,以便 AppSync 的订阅可以正确路由您的消息。

然后,您可以让客户订阅多次,为他们想要通知的每个组订阅一次。

这是订阅授权文档,其中包含与您的示例类似的示例:https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html#real-time-data

【讨论】:

以上是关于AppSync GraphQL 订阅以分组数据的主要内容,如果未能解决你的问题,请参考以下文章

AppSync/Amplify - 如何定义 GraphQL 订阅

Appsync 的 graphql 订阅不适用于 PHP5

用于 AWS AppSync 中的异步计算的 Graphql 订阅

Appsync 客户端对 GraphQL 突变的 Angular 订阅

放大/反应 AppSync graphql 订阅 @auth 错误

迁移到纯 websocket 后,我​​在 AWS Appsync 上收到 GraphQL 订阅错误