1

Ich habe vor kurzem begonnen, mit AWS AppSync zu experimentieren, aber ich hatte einige Fragen zu AWS Cognito.Speichern Sie AWS Cognito-Benutzer in DynamoDB

Ich möchte für Benutzer in der Lage sein, mit Facebook zu authentifizieren, aber ich brauche ihr Profilbild, Name und E-Mail als Daten für meine öffentlichen Benutzerprofile in meiner App. Bis jetzt ist mir aufgefallen, dass Cognito in Facebook Auth integriert ist, aber es erlaubt keinen Zugriff auf die Benutzerinformationen und diese Informationen werden nicht in einer DynamoDB-Tabelle gespeichert.

Meine Frage ist, wie kann ich einen neuen Benutzer in DynamoDB erstellen, wenn Cognito eine neue Anmeldung empfängt oder einen vorhandenen Benutzer/ID zurückgibt, wenn der Benutzer bereits in der Datenbank vorhanden ist.

Antwort

0

Ich habe versucht, das gleiche vor ein paar Wochen zu erreichen.

Nachdem ich stundenlang die Dokumente gelesen hatte, wurde mir klar, dass Cognito uns in Bezug auf die Daten, die von FB zurückkommen, nicht helfen kann oder wie man sie speichert.

landete ich folgendes tun:

(1) Mit FB-SDK, in den Benutzerdaten gezogen.

(2) Eine Lambda-Funktion aufgerufen, die diese Daten (wie FB_id usw.) in DynamoDB gespeichert hat.

(3) Wenn sich ein Benutzer erneut anmeldete, wurde seine FB_id (oder E-Mail) verwendet, um zu überprüfen, ob DynamoDB-Einträge ihre Daten abrufen.

Wenn Cognito uns helfen kann und ich es irgendwie vermisst habe, würde ich es gerne wissen.

Happy Coding!

+0

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. –

+0

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

+0

Haben Sie zufällig einige Code-Snippets, die ich sehen könnte? Das würde mir sehr helfen. Danke für die Antworten tho! –

0

Sie könnten custom attributes und federating user from Facebook in Ihrem Benutzerpool verwenden, um dies zu erreichen. Hier sind die Schritte auf hoher Ebene, um dies zu tun.

  • Sie müssen zuerst benutzerdefinierte Attribute für die Profilinformationen definieren, die Sie in jedem Benutzerprofil speichern möchten.
  • Definieren Sie attribute mapping, um die benutzerdefinierten Attribute mit den Facebook-Attributen zu verknüpfen, die Sie speichern möchten.
  • Erstellen Sie Ihre Anwendung mit Cognito hosted pages und Federation, damit Ihre Benutzer sich über Facebook anmelden können.

Danach wird bei jedem neuen Benutzer anmelden ein neuer Benutzer in der App in mit allen Attributen in Ihrem Benutzer Pool erstellt, die in Attributzuordnung und Werten definiert wurden, die Cognito in den Facebook-Token erhält. Ihre App erhält diese Attributwerte im IDToken, das nach der Authentifizierung ausgegeben wird, und Sie können diese verwenden.

Wenn Sie diese Attributwerte außerdem außerhalb des Cognito-Benutzerpoolprofils speichern möchten, z. B. Ihre eigene DynamoDB-Tabelle, können Sie im Pool eine PreSignUp trigger konfigurieren, die bei allen neuen Benutzererstellungen aufgerufen wird. Sie können die Benutzerattribute aus diesem Auslöser in eine beliebige Datenbank Ihrer Wahl exportieren.

Hoffe, das hilft.

0

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