Graphql 如何使用Appsync授予对Cognoto中某些用户组的访问权限

Graphql 如何使用Appsync授予对Cognoto中某些用户组的访问权限,graphql,amazon-cognito,aws-appsync,aws-amplify,Graphql,Amazon Cognito,Aws Appsync,Aws Amplify,我最近进入了AWS,我正在使用appsync和一个带有用户id idex的dynamo表(来自cognito池),以便只允许特定用户访问特定数据。现在,我想进一步扩展这一点,并允许访问某些cognito组。这是我的密码: 第一。我的变异 ## [Start] Prepare DynamoDB PutItem Request. ** $util.qr($context.args.input.put("createdAt", $util.time.nowISO8601())) $util.q

我最近进入了AWS,我正在使用appsync和一个带有用户id idex的dynamo表(来自cognito池),以便只允许特定用户访问特定数据。现在,我想进一步扩展这一点,并允许访问某些cognito组。这是我的密码:

第一。我的变异

    ## [Start] Prepare DynamoDB PutItem Request. **
$util.qr($context.args.input.put("createdAt", $util.time.nowISO8601()))
$util.qr($context.args.input.put("updatedAt", $util.time.nowISO8601()))
$util.qr($context.args.input.put("__typename", "Patient"))

## This line adds the userId, accessed from the $ctx.identity variable
$util.qr($context.args.input.put("userId", $ctx.identity.sub))
$util.qr($context.args.input.put("Groupi", $ctx.identity.claims.get("cognito:groups")))



{
  "version": "2017-02-28",
  "operation": "PutItem",
  "key": {
      "id":     $util.dynamodb.toDynamoDBJson($util.defaultIfNullOrBlank($ctx.args.input.id, $util.autoId()))
  },
  "attributeValues": $util.dynamodb.toMapValuesJson($context.args.input),
  "condition": {
      "expression": "attribute_not_exists(#id)",
      "expressionNames": {
          "#id": "id"
    }
  }
}
以及查询

#set( $limit = $util.defaultIfNull($context.args.limit, 10) )

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "limit": $limit,
    "index": "userId-index",
    "query" : {
        "expression": "userId = :userId",
        "expressionValues" : {
            ":userId" : $util.dynamodb.toDynamoDBJson($ctx.identity.sub)
        }
    },
    "nextToken":   #if( $context.args.nextToken )
      "$context.args.nextToken"

     #else
     null
    #end
}
我想扩展查询以支持t6he组。非常感谢您的帮助。
谢谢

授权文档中有很多您可能会觉得有用的示例:

具体来说,这一点:

#set($expression = "")
#set($expressionValues = {})
#foreach($group in $context.identity.claims.get("cognito:groups"))
    #set( $expression = "${expression} contains(groupsCanAccess, :var$foreach.count )" )
    #set( $val = {})
    #set( $test = $val.put("S", $group))
    #set( $values = $expressionValues.put(":var$foreach.count", $val))
    #if ( $foreach.hasNext )
    #set( $expression = "${expression} OR" )
    #end
#end
{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "limit": #if(${context.arguments.count}) "${context.arguments.count}" #else 20 #end,
    "nextToken": #if(${context.arguments.nextToken}) "${context.arguments.nextToken}" #else null #end,
    "filter":{
        "expression": "$expression",
        "expressionValues": $utils.toJson($expressionValues)
    }
}
这个例子有一些额外的信息,因为它是关于一个列表调用而不是一个简单的get,但是您可以看到它是在表达式/表达式值中设置的。这个实现看起来有点不同,因为它允许用户在多个组中,其中任何一个都可以工作


这有意义吗?

这里的其他示例似乎更符合“细粒度访问控制”部分,根据您的需要,这可能是正确的选择:

对于更一般的情况,如果您查看“安全性”文档页面,也有一个很好的示例说明如何在GraphQL模式中直接使用指令:

特别是对于您的用例,
@aws\u auth
@aws\u cognito\u user\u pool
指令似乎是相关的。全部名单如下:

  • @aws\u api\u key
    -指定字段为
    api\u key
    已授权
  • @aws_iam
    -指定该字段为
    aws_iam
    授权字段
  • @aws\u oidc
    -指定该字段是
    OPENID\u CONNECT
    授权的
  • @aws\u cognito\u user\u pools
    -指定该字段是
    AMAZON\u cognito\u user\u pools
    授权的
要从文档页面复制示例,请执行以下操作:

type Query {
   posts:[Post!]!
   @aws_auth(cognito_groups: ["Bloggers", "Readers"])
}

type Mutation {
   addPost(id:ID!, title:String!):Post!
   @aws_auth(cognito_groups: ["Bloggers"])
}

嗨,杰夫·贝利,我真的不明白对不起。但我并没有真正理解在我的场景中,为了让它工作,我必须替换哪些值。谢谢,很高兴听到!