Comment modifier les attributs d'un groupe d'utilisateurs Amazon Cognito après sa création ?

Date de la dernière mise à jour : 24/06/2019

J'ai créé un groupe d'utilisateurs Amazon Cognito et je souhaite modifier les attributs standards requis pour l'inscription des utilisateurs. Comment modifier les attributs ?

Brève description

Vous ne pouvez pas modifier les attributs standards d'un groupe d'utilisateurs après sa création. Créez plutôt un nouveau groupe d'utilisateurs avec les attributs que vous souhaitez exiger pour leur inscription. Ensuite, migrez les utilisateurs existants vers le nouveau groupe à l'aide d'une fonction AWS Lambda comme déclencheur de migration des utilisateurs.

Remarque : vous pouvez ajouter des attributs personnalisés à un groupe d'utilisateurs existant, mais ces attributs ne sont pas requis pour l'inscription des utilisateurs.

Résolution

Configuration d'un nouveau groupe d'utilisateurs avec différents attributs

Créez un groupe d'utilisateurs. Ensuite, lors de la configuration (avant de sélectionner Create pool [Créer un groupe] à la fin), modifiez les attributs standards de votre choix.

Important : si vous spécifiez de nouveaux attributs requis dans le groupe d'utilisateurs, vous devez concevoir votre fonction Lambda pour fournir ces nouveaux attributs au nouveau groupe d'utilisateurs, sans quoi l'authentification échouera lors de la migration des utilisateurs. Par exemple, imaginons que vous n'aviez requis que l'adresse e-mail dans votre ancien groupe d'utilisateurs, mais que vous avez maintenant requis l'adresse e-mail et le numéro de téléphone dans votre nouveau groupe d'utilisateurs. Dans ce cas, vous devez transmettre les valeurs d'attribut du numéro de téléphone à votre nouveau groupe d'utilisateurs pour que ces derniers puissent s'authentifier.

Création d'une fonction Lambda

Créez une fonction Lambda de migration des utilisateurs à l'aide de l'éditeur de la console Lambda ou en créant et chargeant votre propre package de déploiement.

Voici un exemple de fonction en Python que vous pouvez utiliser pour réaliser des tests :

Remarque : pour UserPoolId, remplacez la valeur d'exemple par l'ID de l'ancien groupe d'utilisateurs. Recherchez cet ID dans la console Amazon Cognito sous l'onglet General Settings (Paramètres généraux) de la page de gestion de votre groupe d'utilisateurs. Pour ClientId, remplacez la valeur d'exemple par l'ID client d'application de l'ancien groupe d'utilisateurs. Recherchez-le également dans la console Amazon Cognito sous l'onglet General Settings (Paramètres généraux), puis sélectionnez App clients (Clients d'application).

Important : cet exemple de code ne permet pas de migrer les utilisateurs qui utilisent la Multi-Factor Authentication (MFA) dans l'ancien groupe d'utilisateurs.

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

Ajout d'un déclencheur de migration d'utilisateurs au nouveau groupe d'utilisateurs

Dans la console Amazon Cognito, définissez votre nouvelle fonction Lambda comme déclencheur Lambda de migration d'utilisateurs. Pour plus d'informations, consultez la section Ajout d'un déclencheur Lambda de groupe d'utilisateurs.

Activation du flux USER_PASSWORD_AUTH pour migrer des utilisateurs

Configurez votre client d'application de groupe d'utilisateurs de façon à utiliser le flux d'authentification USER_PASSWORD_AUTH au moment de la migration. Cela permet à votre application de transmettre le nom d'utilisateur et le mot de passe de l'utilisateur à la fonction Lambda, puis de les authentifier à partir du groupe d'utilisateurs existant.

Ajoutez la logique à votre application pour que le flux d'authentification par défaut devienne USER_PASSWORD_AUTH pour les tentatives de connexion pour lesquelles l'utilisateur existe dans l'ancien groupe d'utilisateurs, mais pas dans le nouveau.

Par exemple, si votre application utilise JavaScript, vous devez définir cognitoUser.setAuthenticationFlowType comme USER_PASSWORD_AUTH.

Remarque : une fois la migration de vos utilisateurs terminée, il est recommandé de changer le flux d'authentification de votre application en le définissant sur USER_SRP_AUTH. Ce flux authentifie les utilisateurs à l'aide du protocole SRP (Secure Remote Password) sans envoyer de mots de passe sur le réseau. Il offre également des avantages de sécurité par rapport au flux USER_PASSWORD_AUTH. Pour plus d'informations, consultez les sections Flux d'authentification de la migration des utilisateurs et Authentification avec un groupe d'utilisateurs.

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

Pour plus d'informations, consultez la section Exemple : migration des utilisateurs JavaScript avec un déclencheur Lambda.

Test de la configuration

Connectez-vous à votre application à l'aide de l'interface utilisateur web hébergée Amazon Cognito pour tester le flux d'authentification. L'utilisateur avec lequel vous vous connectez est authentifié avec le nouveau groupe d'utilisateurs, puis migré.

Remarque : si vous n'avez pas de compte utilisateur avec lequel vous connecter pour tester la configuration, créez-en un.

Résolution des problèmes

Si vous obtenez un message d'erreur tel que « Exception during user migration » (« Exception lors de la migration de l'utilisateur ») au cours du test, activez la journalisation des instructions depuis Lambda. Cela journalise les paramètres du déclencheur Lambda de migration d'utilisateurs sur Amazon CloudWatch Logs.

Si l'erreur persiste, vérifiez les journaux pour déceler tout problème de paramètres ou toute erreur de syntaxe dans le déclencheur Lambda de migration d'utilisateurs.