aws appsync auth 指令未按预期限制访问

aws appsync auth directive not limiting access as expected

在我的 appsync 的 graphQl 架构中 api 我正在使用 我想根据他们所属的组来限制我的用户操作。

根据文档,添加行 aws_auth(cognito_groups: ["Admins"]) 应该将访问限制为仅属于 "Admins" 组的用户。当我 运行 来自 appsync 控制台或应用程序本身的突变时,这不会发生。

我的突变如下:

type Mutation @aws_iam
@aws_cognito_user_pools {
    createItem(input: CreateItemInput!): Item
    updateItem(input: UpdateItemInput!): Item
    @aws_auth(cognito_groups: ["Admins"])
}

@aws_iam 和@aws_cognito_user_pools 指令似乎工作正常。 但是任何经过身份验证或具有 iam 角色的人仍然可以执行更新,即使他们不属于 "Admins" 组。

这是怎么回事?是否需要进行其他配置才能使其正常工作?

一般来说,您应该避免同时使用 @aws_auth@aws_cognito_user_pools & aws_iam,因为它们的行为略有不同 (see docs here)。

如果您想限制对 updateItem 的访问,同时仍允许任何 IAM 授权用户访问 createItem,那么您可以使用:

type Mutation {
    createItem(input: CreateItemInput!): Item
      @aws_iam
    updateItem(input: UpdateItemInput!): Item
      @aws_cognito_user_pools(cognito_groups: ["Admins"])
}

将指令放在类型上意味着身份验证配置对该类型中的所有字段都有效。将指令放在字段上使其仅适用于该字段。

只是为了进一步澄清,因为这没有很好的记录。

如果您使用单个授权提供程序并且该提供程序是 Cognito,则应始终使用 @aws_auth 指令。不要使用 @aws_cognito_user_pools 指令,因为如果您使用基于组的授权,它就不起作用。这在 AWS Cognito 文档中没有详细记录,并且是一个陷阱,因为 AppSync 将允许您配置此指令。

如果您使用多个授权提供程序并且使用 Cognito,则必须使用 AWS Cognito 文档中记录的 @aws_cognito_user_pools 指令。奇怪的是,基于组的授权使用 @aws_cognito_user_pools 可以正常工作,但仅在使用多个授权提供程序时才能正常工作。