【问题标题】:How to give access to certain user groups in cognito using Appsync如何使用 Appsync 在 cognito 中授予对某些用户组的访问权限
【发布时间】:2019-07-23 14:41:09
【问题描述】:

我最近进入 AWS,我正在使用 appsync 和一个带有用户 ID 索引的发电机表(来自认知池),只允许特定用户访问特定数据。现在我想进一步扩展这一点,并允许访问某些认知组。这是我的代码:

第一。我的变种

    ## [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 组。帮助将不胜感激。 谢谢!

【问题讨论】:

    标签: graphql amazon-cognito aws-appsync aws-amplify


    【解决方案1】:

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

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

    特别是对于您的用例,@aws_auth@aws_cognito_user_pools 指令似乎相关。完整列表是:

    • @aws_api_key - 指定字段为API_KEY 授权。
    • @aws_iam - 指定该字段为AWS_IAM 授权。
    • @aws_oidc - 指定该字段为OPENID_CONNECT 授权。
    • @aws_cognito_user_pools - 指定该字段为AMAZON_COGNITO_USER_POOLS 授权。

    从文档页面复制示例:

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

    【讨论】:

      【解决方案2】:

      授权文档中有很多示例可能会对您有所帮助:https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html

      具体来说,这个:

      #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,但是你可以看到它被设置在表达式/表达式值中。此实现看起来与您的实现有点不同,因为它允许用户位于多个组中,其中任何一个都可以工作。

      这有意义吗?

      【讨论】:

      • 嗨@Jeff Bailey,我真的不明白对不起。但我并没有真正理解我必须替换哪些值才能让它在我的场景中工作。谢谢
      • 太棒了,很高兴听到它!
      猜你喜欢
      • 1970-01-01
      • 2020-09-27
      • 2021-10-06
      • 2019-10-03
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      相关资源
      最近更新 更多