Durch die Nutzung von AWS re:Post stimmt du den AWS re:Post Nutzungsbedingungen

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

Lesedauer: 5 Minute
0

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

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. Verwenden Sie anschließend eine AWS-Lambda-Funktion als Auslöser für die Benutzermigration, um bestehende Benutzer in den neuen Benutzerpool zu migrieren.

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

Behebung

Einen neuen Benutzerpool mit unterschiedlichen Attributen einrichten

Erstellen Sie einen neuen Benutzerpool. Bevor Sie dann Pool erstellen wählen, bearbeiten Sie die Standardattribute nach Ihren Wünschen.

Wichtig: Wenn Sie neue erforderliche Attribute im Benutzerpool angeben, legen Sie Ihre Lambda-Funktion so aus, dass sie diese neuen Attribute für den neuen Benutzerpool bereitstellt. Wenn Sie die Funktion nicht so entwerfen, dass sie die neuen Attribute bereitstellt, schlägt die Authentifizierung während der Benutzermigration fehl. Angenommen, Ihr alter Benutzerpool benötigte lediglich E-Mail, Ihr neuer Benutzerpool benötigt allerdings sowohlE-Mail als auch Telefonnummer. Übergeben Sie in diesem Fall Attributwerte für die Telefonnummer an Ihren neuen Benutzerpool, um Benutzer erfolgreich zu authentifizieren.

Lambda-Funktion erstellen

Um eine Lambda-Funktion für die Benutzermigration zu erstellen, nutzen Sie den Lambda-Konsoleneditor oder erestellen Sie Ihr eigenes Bereitstellungspaket erstellen und laden es hoch.

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

Verwenden Sie die folgende Beispielfunktion in Python, um Ihre Konfigurationen zu testen:

# 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')

Hinweis: Ersetzen Sie UserPoolId 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 ClientId durch die App-Client-ID des alten Benutzerpools. Suchen Sie die App-Client-ID in der Amazon-Cognito-Konsole unter App-Clients.

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. Mit diesem Authentifizierungsablauf kann Ihre App den Benutzernamen und das Passwort des Benutzers an die Lambda-Funktion weitergeben. Der Authentifizierungsablauf kann dann den Benutzer aus dem vorhandenen Benutzerpool authentifizieren.

Fügen Sie Ihrer App Logik hinzu, um den Standardauthentifizierungsablauf auf den Ablauf USER_PASSWORD_AUTH zu ändern. Lassen Sie die Logik den Authentifizierungsablauf für Anmeldeversuche ändern, bei denen der Benutzer im alten Benutzerpool, aber nicht im neuen Benutzerpool existiert.

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 Flow verwendet das Secure Remote Password (SRP)-Protokoll, um Benutzer zu authentifizieren, ohne dass Passwörter über das Netzwerk gesendet werden müssen. Dieser Flow bietet zudem Sicherheitsvorteile gegenüber dem Ablauf USER_PASSWORD_AUTH.

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);
        }
    });

Testen Sie das Setup

Verwenden Sie die von Amazon Cognito gehostete Web-Benutzeroberfläche zum Anmelden bei Ihrer App, 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 anmelden können, um Ihre Konfigurationen zu testen, erstellen Sie einen neuen Benutzer.

Probleme beheben

Wenn Sie beim Testen eine Fehlermeldung erhalten, z. B. „Exception during user migration“, aktivieren Sie die Protokollierung von Anweisungen von Lambda. Diese Einstellung protokolliert die Parameter für einen Lambda-Auslöser für die Benutzermigration in Amazon CloudWatch Logs. 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?

Benutzerpools

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 7 Monaten