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
person
Richard
schedule
15.02.2018