【问题标题】:Public queries and mutations (no authentication)公共查询和突变(无身份验证)
【发布时间】:2025-12-11 22:30:01
【问题描述】:

says 文档中有 3 种方法可以授权应用程序与 API 进行交互,但看起来没有一种方法可以使用 public 端点。

例如,如果我希望任何人查询待办事项列表,但只有经过身份验证的用户可以向该列表添加待办事项,我该如何实现?

或者如果我想允许任何人进行schema introspection,但将所有其他查询限制为经过身份验证的用户,这可能吗?

我正在使用 cognito 进行身份验证。我注意到有一个AppId client regex 字段显示(Optional) Type a regular expression to allow or block requests to this API.,但不幸的是我找不到任何示例。也许这就是我要找的东西?

谢谢

朱利安

【问题讨论】:

  • 你能澄清一下这是 Cognito 用户池还是 Cognito 联合身份?
  • 你解决过这个问题吗?
  • 不,永远不会不幸。当时还是预览版,几个月没看,也许现在是公共端点?

标签: amazon-web-services aws-appsync


【解决方案1】:

有几种方法可以根据身份验证机制执行此操作。

假设您正在使用 Cognito Identity 并使用 AWS IAM 流进行身份验证。然后,您将有 2 个策略,一个用于经过身份验证的用户,一个用于未经过身份验证的用户。

给定一个 GraphQL 架构

schema{
   query:Query
   mutation:Mutation
}

type Query{
   listTodo(count:Int, paginationToken:String):[TodoConnection];

}

type Mutation{
   addTodo(input:TodoInput):Todo
}

您的未经身份验证的政策看起来像

{
  "Version": "2012-10-17",
  "Statement": [
  {
     "Effect": "Allow",
     "Action": [
        "appsync:GraphQL"
     ],
     "Resource": [
        "arn:aws:appsync:us-west-2:<account-id>:apis/<api-id>/types/Query/fields/listTodo", 
        //-> below is for schema introspection
        "arn:aws:appsync:us-west-2:<account-id>:apis/<api-id>/types/Query/fields/__schema" 
     ]
    ]
   }
}

经过身份验证的用户策略如下所示

{
  "Version": "2012-10-17",
  "Statement": [
  {
     "Effect": "Allow",
     "Action": [
        "appsync:GraphQL"
     ],
     "Resource": [
        "arn:aws:appsync:us-west-2:<account-id>:apis/<api-id>/types/Mutation/fields/addTodo",
        "arn:aws:appsync:us-west-2:<account-id>:apis/<api-id>/types/Query/fields/listTodo", 
        //-> below is for schema introspection
        "arn:aws:appsync:us-west-2:<account-id>:apis/<api-id>/types/Query/fields/__schema"
     ]
    ]
   }
}

如果您使用的是 JWT 令牌,那么您必须将每个 Cognito 用户池用户与一个组(如“管理员”、“用户”等)相关联。然后,您必须将每个查询/突变与可以使用 AWS AppSync auth 指令执行操作的 Cognito 组相关联。要做到这一点,您只需要像下面这样更新架构:

schema{
   query:Query
   mutation:Mutation
}

type Query{
   listTodo(count:Int, paginationToken:String):[TodoConnection];
     @aws_auth(cognito_groups:["Users", "Admin"])
}

type Mutation{
   addTodo(input:TodoInput):Todo
     @aws_auth(cognito_groups:["Admin"])
}

基于 API 密钥的身份验证,无法控制操作。

【讨论】:

  • 您的 JWT 选项仅在存在活动会话时才有效。我相信 OP 是在询问公共查询,这意味着根本没有人登录。