AWS AppSync允许您访问您可以选择存储在DynamoDB表中的GraphQL解析器中的信息。对于来自Facebook配置文件的数据,您可以将此参数作为参数传递给GraphQL突变或传递给AppSync,然后您可以通过$ctx.request.headers.NAME
在解析器中访问,其中NAME是您的标题名称。然后,您可以简单地选择要为该用户写入DynamoDB的属性作为突变的一部分。更多信息的参考指南在这里:https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html
既然你还问,你想先做检查,看用户是否已经在DDB第一,你可以只是做一个存在性检查第一:
{
"version": "2017-02-28",
"operation": "PutItem",
"key": {
"userId": $util.dynamodb.toDynamoDBJson($ctx.identity.username),
},
"attributeValues": $util.dynamodb.toMapValuesJson($ctx.args.input),
"condition": {
"expression": "attribute_not_exists(userId)"
},
}
这会根据Cognito用户池中的用户名进行检查。如果您使用的是Cognito Federated Identities功能,它将是ctx.identity.cognitoIdentityId
。如果记录已经存在,返回的响应会告诉你哪个意味着用户已经存在。您还可以通过使用条件语句查看$ctx.result
并通过从头开始构建JSON响应或使用上述指南中的$util.error()
方法之一来在响应映射模板中转换返回的消息。
最后,正如您所提到的,您将拥有公开的个人资料数据,您可能希望在某些记录上标记以便进行控制。在AWS AppSync中,您可以过滤像这样的授权元数据上的GraphQL响应。您只需在DynamoDB记录上标记“公开”或“私有”的属性(又名列)即可。然后你的回应范本看起来像这样:这这里
#if($context.result.public == 'yes')
$utils.toJson($context.result)
#else
$utils.unauthorized()
#end
你可以看到更多的例子:https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html#public-and-private-records
但后来你会怎么做授权未来API请求? Cognito会返回一个您可以添加为标题的jwt,但是我认为很难用发电机来模拟这种行为? –
据我了解,如果提供的令牌是有效的,Cognito仍然会经历与FB检查的整个过程。如果Cognito回来并说其有效并给我一个jwt,然后我会提取用户详细信息并处理它在DDB中我自己。 – nishkaush
你碰巧有一些我可以查看的代码片段吗?这对我非常有帮助。谢谢你的回复! –