使用 AWS Amplify 和 AWS Cognito 进行数据特定授权

Posted

技术标签:

【中文标题】使用 AWS Amplify 和 AWS Cognito 进行数据特定授权【英文标题】:Data-specific Authorization with AWS Amplify & AWS Cognito 【发布时间】:2021-10-01 20:12:32 【问题描述】:

背景

大家好。首先,我正在学习 AWS Amplify / GraphQL,所以我不确定这是否是 GraphQL 特定的问题,或者它是否与 AWS Cognito 相关。也就是说,如果这个问题被认为是题外话,请引导我到更合适的地方问这个问题。

问题

使用 AWS Amplify 和 AWS Cognito,我希望 GraphQL 层仅响应特定于该实体的数据。举个例子:

给定一个组织和用户数据库结构,其中许多用户属于一个组织,我如何确保用户只能与特定于其所属组织的数据进行交互?

更详细的例子

鉴于下图,我如何确保user #2 在查询 AWS Amplify GraphQL 层时,他们永远无法与organization #1 的数据进行交互?

我试过的

目前,在 GraphQL 层中,我为每个查询手动添加了 WHERE 子句,这样客户端就无法查看跨组织数据。但是,这不会阻止任何用户创建自己的查询来查看跨组织数据。我目前正在考虑建立一个custom authorization resolver,但它似乎还不符合我的具体需求。

非常感谢任何帮助。

【问题讨论】:

看起来@derrops 有一个很好的答案。您是否绑定到任何特定的身份验证流程?隐式资助? /身份验证代码/客户端凭据? 在我看来这是一个认知问题,需要在您的一个用户池中设置多个组。?那个声音对吗?您是否查看过docs.aws.amazon.com/cognito/latest/developerguide/…,然后您可以对用户进行自省,并且应该(我认为)应该允许组 admin 与组 guest 中的用户查看相同查询的差异 graphql 模式/类型(甚至隐藏在 gql 中)游乐场可用查询/变异取决于角色) 然后像aws.amazon.com/blogs/mobile/graphql-security-appsync-amplify那样将上述组混合到你的gql类型中 【参考方案1】:

如果你想保持Amplify的做事方式,你可以使用Authorization Rules。

如果组织中的用户在同一个Cognito 组中,那么您可以使用Dynamic group authorization。例如:

type Sale @model @auth(rules: [ allow: groups, groupsField: "org" ]) 
  id: ID!
  org: [String]

这样,只有销售人员才能访问具有与其自己匹配的组/组织的销售。

属性

或者,您也可以使用用户的属性,以及 ownerField 指令。

【讨论】:

以上是关于使用 AWS Amplify 和 AWS Cognito 进行数据特定授权的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS Amplify 和 AWS Cognito 进行数据特定授权

AWS Amplify and React - 找不到模块:无法解析“@aws-amplify/analytics”

Flutter 与 AWS 的集成(有和没有 Amplify)

使用 Amplify 集成构建 AWS Amplify React 应用程序时总是缺少 aws-exports.js

如何使用 Amplify 框架从 AWS 中的 API 获取 http 状态和详细响应?

AWS Amplify 错误从 aws-amplify 导入 StorageProvider 类