AWS AppSync 允许您访问 GraphQL 解析器中的信息,您可以选择将这些信息存储在 DynamoDB 表中。对于来自 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