使用 AWS AppSync(带放大),如何允许经过身份验证的用户只读访问,但只允许对象所有者的突变?
Posted
技术标签:
【中文标题】使用 AWS AppSync(带放大),如何允许经过身份验证的用户只读访问,但只允许对象所有者的突变?【英文标题】:Using AWS AppSync (with amplify), how does one allow authenticated users read-only access, but only allow mutations for object owners? 【发布时间】:2020-04-19 15:14:08 【问题描述】:我使用 Cognito 用户池作为默认身份验证方法。我还将 iam 用于我的 lambda 后端。我在 lambda 函数中为一些自定义解析器使用 aws appsync 客户端。
假设我有一个基本如下所示的 User 对象类型:
type User
id: ID!
displayName: String!
我想做什么:
-
允许对象所有者的完全读/写访问权限。
允许 lambda 函数(带有 iam)完全读/写访问权限。
允许通过 cognito 用户池进行身份验证但不是对象所有者的用户进行只读访问。
我一直在使用@auth 指令进行挑选和刺激,试图获得我正在寻找的结果,但没有任何效果。我查看了AWS GraphQL Transform Docs 的文档,似乎有点困惑。
这是我尝试过的:
type User
@model
@auth(rules: [
allow: owner, operations: [create, update, delete]
allow: private, provider: iam, operations: [update, delete]
])
id: ID!
displayName: String!
据我了解,通过从 @auth 指令中的操作列表中删除读取,可以删除对 get 和 list 查询的检查。我究竟做错了什么?我如何达到我想要的结果?
编辑:澄清一下,我已经启用了多种授权类型。 (默认情况下 cognito 用户池和 lambda 解析器的 iam)。我的问题是:如何使用 @auth 指令来获得预期的结果?
【问题讨论】:
【参考方案1】:AuthProvider apiKey iam oidc userPools
所以,我希望这可以帮助你(它对我有用:-))
type User @model @auth(rules: [
allow: owner ,operations: [create, update, delete],
allow: private, provider: iam, operations: [read, update, delete]
allow: private, provider: userPools, operations: [read]
])
id: ID!
name: String!
【讨论】:
我必须为我的 lambda 函数向 iam 添加读取操作,但除此之外,您的回答对我有很大帮助!将“read”添加到 iam 的身份验证规则中,我将为您选择赏金的答案。 :) 很高兴听到它【参考方案2】:要同时启用 IAM 和 Cognito,您需要遵循使用多种授权类型的说明:https://aws.amazon.com/blogs/mobile/using-multiple-authorization-types-with-aws-appsync-graphql-apis/
例如在各个字段上指定 @aws_iam 或 @aws_cognito_user_pools
对于您的用例,您可能还需要在解析器中添加一些代码来控制哪些用户可以执行哪些操作,如:https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html
中所述例如沿着 #if($context.result["Owner"] == $context.identity.username)
如果您希望纯粹通过 Amplify CLI 执行此操作,此人似乎已经解决了一个非常相似的问题:https://github.com/aws-amplify/amplify-cli/issues/2694
【讨论】:
感谢您提供帮助,但这并不能回答问题。以上是关于使用 AWS AppSync(带放大),如何允许经过身份验证的用户只读访问,但只允许对象所有者的突变?的主要内容,如果未能解决你的问题,请参考以下文章
如果我不使用放大,如何从 AppSync GraphQL 架构生成 Typescript 定义?
aws amplify appsync 中的 Graphql 突变错误
如何使用 Aws AppSync 将 JWT 令牌(或任何其他变量)从父解析器传递给子解析器