AWS AppSync 订阅:基于更新文档中的对象的复杂授权

Posted

技术标签:

【中文标题】AWS AppSync 订阅:基于更新文档中的对象的复杂授权【英文标题】:AWS AppSync Subscriptions: Complex Authorization based on Object with in Updated Document 【发布时间】:2019-03-21 14:40:02 【问题描述】:

将被突变更改的对象包含一个 permissions 数组,其中包含 user 对象,该对象由 userIdwrite 权限布尔值组成。如果列表中存在用户的userId,则用户对该对象具有读取权限。如果write设置为true,用户也有写权限。

这使得从变异的角度修改对象更容易,但它使处理订阅变得更加困难,因为我无权访问在订阅创建时更新的对象。因此,我无法确保用户只有在拥有适当权限的情况下才能获得对象的更新。

我认为这没有什么不同(因为我无法在客户端安全地处理这个问题),但我正在构建一个 React Web 客户端。

有没有可行的办法解决这个问题?

【问题讨论】:

【参考方案1】:

一种可能的解决方案是设置一个订阅所有新突变的服务器端作业。此服务器端侦听器将接收每个新突变,查看权限列表,并使用 None 数据源解析器发布给授权用户。用户只能使用其用户 ID 订阅订阅。

架构看起来像这样:

type Object 
  permissions: [User]
  //.. Other fields


type User 
  userId: ID!
  write: Boolean


// The server listener will populate this
type PublishPayload 
  userId: ID!
  objectToPublish: Object


type Mutation 
  // The original mutation
  updateObject(): Object

  // The server-side listener will use this to publish. Attach a None Resolver to it.
  publishToUser(userId: ID!): PublishPayload


type Subscription 
  // This subscription is used by the server to listen to all updateObject mutations
  serverSubscription(): Object
  @aws_subscribe(mutations:["updateObject"])

  // This subscription is used by the users. 
  // You would add a resolver to it that fails authorization if they try to subscribe to a different user.
  userSubscription(userId: ID!): PublishPayload
  @aws_subscribe(mutations:["publishToUser"])

//.. More schema

希望这会有所帮助!

【讨论】:

这是个好主意。我今晚会试一试,让你知道它是怎么回事。我不禁觉得,总的来说,为了将 AppSync 用作 SaaS 提供商,我正在应用很多“变通办法”,但我认为就价格而言,没有什么比它更好的了。我只是希望它被证明是可维护的。 在这种情况下,服务器端侦听器是否不需要是 EC2 实例或容器,因为 Lambda 是短暂的?

以上是关于AWS AppSync 订阅:基于更新文档中的对象的复杂授权的主要内容,如果未能解决你的问题,请参考以下文章

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

AWS Appsync 订阅未更新我的组件

如何订阅 AWS AppSync 客户端中的多个事件?

AWS Amplify AppSync 订阅无法正常工作

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

订阅 AWS AppSync 中的群组/私人聊天列表