Mit AWS AppSync können Sie auf Informationen im GraphQL-Auflöser zugreifen, die Sie in einer DynamoDB-Tabelle speichern können. In Ihrem Fall könnten Daten, die von einem Facebook-Profil kommen, als Argumente an eine GraphQL-Mutation oder in einer Kopfzeile an AppSync übergeben werden, auf die Sie dann im Resolver über $ctx.request.headers.NAME
zugreifen können, wobei NAME der Kopfzeilenname ist.Dann könnten Sie einfach auswählen, welche Attribute Sie als Teil der Mutation für diesen Benutzer in DynamoDB schreiben möchten. Weitere Informationen finden Sie im Referenz-Handbuch hier: https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html
Da Sie auch gefragt, dass Sie zunächst einen Scheck tun mögen, um zu sehen, ob der Benutzer bereits in der DDB ist zunächst konnte man gerade noch eine Existenzprüfung tun:
{
"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)"
},
}
Dies wird anhand des Benutzernamens von Cognito User Pools überprüft. Wenn Sie die Funktion Cognito Federated Identities verwenden, ist dies ctx.identity.cognitoIdentityId
. Wenn der Datensatz bereits vorhanden ist, wird die Antwort, die zurückkommt, Ihnen sagen, was bedeutet, dass der Benutzer bereits vorhanden ist. Sie könnten die zurückgegebene Nachricht auch in der Antwortzuordnungsvorlage transformieren, indem Sie $ctx.result
mit einer bedingten Anweisung anzeigen und die JSON-Antwort entweder mit der Grundstruktur erstellen oder eine der Methoden $util.error()
im obigen Leitfaden verwenden.
Schließlich, wie Sie erwähnt haben, dass Sie öffentliche Profildaten haben, möchten Sie dies möglicherweise auf bestimmten Datensätzen zur Kontrolle markieren. In AWS AppSync können Sie GraphQL-Antworten auf Autorisierungsmetadaten wie diese filtern. Sie würden nur ein Attribut (aka Spalte) auf dem DynamoDB-Datensatz als "öffentlich" oder "privat" markiert haben. Dann ist Ihre Antwortvorlage aussehen würde so:
#if($context.result.public == 'yes')
$utils.toJson($context.result)
#else
$utils.unauthorized()
#end
Sie können mehr sehen Beispiele dafür hier: https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html#public-and-private-records
Aber was tun Sie, zukünftige api Anfragen zu genehmigen? Cognito gibt einen JWT zurück, den Sie als Kopfzeile hinzufügen können, aber ich denke, es ist schwierig, dieses Verhalten mit Dynamo zu ändern. –
Wie ich es verstanden habe, durchläuft Cognito immer noch den gesamten Prozess der Überprüfung mit der FB, ob das angegebene Token gültig ist usw. Wenn Cognito zurückkommt und seine Gültigkeit sagt und mir einen JWT zurückgibt, nehme ich dann die Benutzerdetails und gehe damit um allein in DDB. – nishkaush
Haben Sie zufällig einige Code-Snippets, die ich sehen könnte? Das würde mir sehr helfen. Danke für die Antworten tho! –