如何使用 Appsync 在 cognito 中授予对某些用户组的访问权限
Posted
技术标签:
【中文标题】如何使用 Appsync 在 cognito 中授予对某些用户组的访问权限【英文标题】:How to give access to certain user groups in cognito using Appsync 【发布时间】: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 组。帮助将不胜感激。 谢谢!
【问题讨论】:
【参考方案1】:此处的其他示例似乎更适合“细粒度访问控制”部分,根据您的需要,这可能是正确的选择:
https://docs.aws.amazon.com/appsync/latest/devguide/security.html#fine-grained-access-control对于更一般的情况,如果您查看“安全”文档页面,还有一个很好的示例说明如何直接在 GraphQL 架构中使用指令:
https://docs.aws.amazon.com/appsync/latest/devguide/security.html#amazon-cognito-user-pools-authorization特别是对于您的用例,@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,我真的不明白对不起。但我并没有真正理解我必须替换哪些值才能让它在我的场景中工作。谢谢 太棒了,很高兴听到它!以上是关于如何使用 Appsync 在 cognito 中授予对某些用户组的访问权限的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python 调用具有 Cognito 身份验证的 AppSync 突变?
当 AWS AppSync 使用 Cognito 时如何验证 Lambda 生成的突变
AppSync ReactNative Cognito 承诺拒绝
参考 AppSync 和 Cognito Auth 的现有设置