公共查询和突变(无身份验证)

时间:2018-01-09 18:54:34

标签: amazon-web-services aws-appsync

文档says我们有3种方法可以授权应用程序与API进行交互,但它看起来没有办法拥有 public 端点

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

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

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

由于

于连

1 个答案:

答案 0 :(得分:6)

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

假设您正在使用Cognito Identity并使用AWS IAM流进行身份验证。那么您将有2个策略用于Authenticated User,1个用于未经身份验证的用户。

给定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用户池用户与一个组关联起来(例如&#34; Admin&#34;,&#34; Users&#34;等)。然后,您必须将每个查询/突变与可以使用AWS AppSync auth指令执行操作的Cognito Groups相关联。为此,您只需要更新下面的架构:

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密钥的身份验证,无法控制操作。