Wie ändere ich die Attribute eines Amazon Cognito-Benutzerpools nach der Erstellung?

Lesedauer: 6 Minute
0

Ich habe einen Amazon Cognito-Benutzerpool erstellt und möchte jetzt die Standardattribute ändern, die für die Benutzerregistrierung erforderlich sind. Wie ändere ich die Attribute?

Kurzbeschreibung

Sie können Standard-Benutzerpool-Attribute nicht ändern, nachdem ein Benutzerpool erstellt wurde. Erstellen Sie stattdessen einen neuen Benutzerpool mit den Attributen, die Sie für die Benutzerregistrierung voraussetzen möchten. Migrieren Sie anschließend bestehende Benutzer in den neuen Benutzerpool, indem Sie eine AWS Lambda-Funktion als Auslöser für die Benutzermigration verwenden.

Hinweis: Sie können einem vorhandenen Benutzerpool benutzerdefinierte Attribute hinzufügen, diese Attribute sind jedoch für die Benutzerregistrierung nicht erforderlich.

Lösung

Einen neuen Benutzerpool mit unterschiedlichen Attributen einrichten

Erstellen Sie einen neuen Benutzerpool. Bearbeiten Sie dann während der Einrichtung (bevor Sie am Ende Pool erstellen wählen) die Standardattribute nach Ihren Wünschen.

Wichtig: Wenn Sie neue erforderliche Attribute im Benutzerpool angeben, müssen Sie Ihre Lambda-Funktion so auslegen, dass sie diese neuen Attribute für den neuen Benutzerpool bereitstellt. Wenn Sie dies nicht tun, schlägt die Authentifizierung während der Benutzermigration fehl. Nehmen wir an, Sie haben in Ihrem alten Benutzerpool lediglich E-Mail vorausgesetzt, fordern jetzt in Ihrem neuen Benutzerpool jedoch sowohl E-Mail als auch Telefonnummer. In diesem Fall müssen Sie Attributwerte für die Telefonnummer an Ihren neuen Benutzerpool übergeben, um Benutzer erfolgreich zu authentifizieren.

Eine Lambda-Funktion erstellen

Erstellen Sie eine Lambda-Funktion für die Benutzermigration mithilfe des Lambda-Konsoleneditors oder indem Sie Ihr eigenes Bereitstellungspaket erstellen und hochladen.

Hier eine Beispielfunktion in Python, die Sie zum Testen verwenden können:

Hinweis: Ersetzen Sie für UserPoolId den Beispielwert durch die ID des alten Benutzerpools. Suchen Sie die ID in der Amazon Cognito-Konsole auf der Verwaltungsseite für den Benutzerpool auf der Registerkarte Allgemeine Einstellungen. Ersetzen Sie für ClientId den Beispielwert durch die App-Client-ID des alten Benutzerpools. Die App-Client-ID finden Sie ebenfalls in der Amazon Cognito-Konsole – wählen Sie unter Allgemeine Einstellungen die Option App-Clients aus.

Wichtig: Dieser Beispielcode funktioniert nicht, wenn Benutzer migriert werden, die die Multi-Faktor-Authentifizierung (MFA) im alten Benutzerpool verwenden.

# Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# Permission is hereby granted, free of charge, to any person obtaining a copy of this
# software and associated documentation files (the "Software"), to deal in the Software
# without restriction, including without limitation the rights to use, copy, modify,
# merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

import json
import boto3

client = boto3.client('cognito-idp')

def lambda_handler(event, context):
   if (event['triggerSource'] == 'UserMigration_Authentication'):
     user = client.admin_initiate_auth(
       UserPoolId='<user pool id of the user pool where the user already exists>',
       ClientId='<app client id of the user pool where the user already exists>',
       AuthFlow='ADMIN_NO_SRP_AUTH',
       AuthParameters={
         'USERNAME': event['userName'],
         'PASSWORD': event['request']['password']
       }
     )
        if (user):
       userAttributes = client.get_user(
         AccessToken=user['AuthenticationResult']['AccessToken']
       )
       for userAttribute in userAttributes['UserAttributes']:
         if userAttribute['Name'] == 'email':
           userEmail = userAttribute['Value']
           #print(userEmail)
           event['response']['userAttributes'] = {
             "email": userEmail,
             "email_verified": "true"
           }
          event['response']['messageAction'] = "SUPPRESS"
       print (event)
       return (event)
     else:
       return('Bad Password')
   elif (event["triggerSource"] == "UserMigration_ForgotPassword"):
     user = client.admin_get_user(
       UserPoolId='<user pool id of the user pool where the already user exists>',
       Username=event['userName']
     )
     if (user):
       for userAttribute in user['UserAttributes']:
         if userAttribute['Name'] == 'email':
           userEmail = userAttribute['Value']
           print(userEmail)
           event['response']['userAttributes'] = {
             "email": userEmail,
             "email_verified": "true"
           }
       event['response']['messageAction'] = "SUPPRESS"
          print (event)
       return (event)
     else:
       return('Bad Password')
          else:
     return('there was an error')

Dem neuen Benutzerpool einen Auslöser für die Benutzermigration hinzufügen

Legen Sie in der Amazon Cognito-Konsole Ihre neue Lambda-Funktion als Lambda-Auslöser für die Benutzermigration fest. Weitere Informationen finden Sie unter Hinzufügen eines Lambda-Auslösers für einen Benutzerpool.

Den Ablauf USER_PASSWORD_AUTH für die Benutzermigration aktivieren

Konfigurieren Sie Ihren Benutzerpool-App-Client so, dass er zum Zeitpunkt der Migration den Authentifizierungsablauf USER_PASSWORD_AUTH verwendet. So kann Ihre App den Benutzernamen und das Passwort des Benutzers an die Lambda-Funktion weitergeben und ihn dann aus dem vorhandenen Benutzerpool heraus authentifizieren.

Fügen Sie Ihrer App eine Logik hinzu, um den Standardauthentifizierungsablauf für Anmeldeversuche, bei denen der Benutzer im alten, jedoch nicht im neuen Benutzerpool existiert, zum Ablauf USER_PASSWORD_AUTH zu ändern.

Wenn Ihre App beispielsweise JavaScript verwendet, geben Sie cognitoUser.setAuthenticationFlowType als USER_PASSWORD_AUTH an.

Hinweis: Nach der Migration Ihrer Benutzer empfiehlt es sich, den Authentifizierungsablauf Ihrer App auf USER_SRP_AUTH zu ändern. Dieser Ablauf authentifiziert Benutzer mithilfe des Secure Remote Password (SRP)-Protokolls, ohne Passwörter über das Netzwerk zu senden. Dieser Flow bietet zudem Sicherheitsvorteile gegenüber dem Ablauf USER_PASSWORD_AUTH. Weitere Informationen finden Sie unter Authentifizierungsablauf für die Benutzermigration und Authentifizierung mit einem Benutzerpool.

cognitoUser.setAuthenticationFlowType('USER_PASSWORD_AUTH');

    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: function(result) {
            // User authentication was successful
        },
        onFailure: function(err) {
            // User authentication was not successful
        },
        mfaRequired: function (codeDeliveryDetails) {
            // MFA is required to complete user authentication.
            // Get the code from user and call
            cognitoUser.sendMFACode(verificationCode, this);
        }
    });

Weitere Informationen finden Sie unter Lambda-Auslöser für Benutzer migrieren.

Einrichtung testen

Melden Sie sich über die von Amazon Cognito gehostete Web-Benutzeroberfläche bei Ihrer App an, um den Authentifizierungsablauf zu testen. Der Benutzer, mit dem Sie sich anmelden, wird mit dem neuen Benutzerpool authentifiziert und dann migriert.

Hinweis: Wenn Sie kein Benutzerkonto haben, mit dem Sie sich zum Testen anmelden können, erstellen Sie einen neuen Benutzer.

Fehlerbehebung

Wenn Sie beim Testen eine Fehlermeldung wie „Ausnahme bei der Benutzermigration“ erhalten, aktivieren Sie die Protokollierung von Anweisungen von Lambda. Hierdurch werden die Parameter für einen Lambda-Auslöser für die Benutzermigration in Amazon CloudWatch Logs protokolliert.

Reproduzieren Sie den Fehler und überprüfen Sie dann die Protokolle auf Probleme mit den Parametern oder Syntaxfehlern im Lambda-Auslöser für die Benutzermigration.


Ähnliche Informationen

Anpassen von Benutzerpool-Workflows mit Lambda-Auslösern

Was ist der Unterschied zwischen Amazon Cognito-Benutzerpools und Identitätspools?

Erste Schritte mit Benutzerpools

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren