J'utilise AWS Cognito pour gérer l'enregistrement des utilisateurs et l'accès des utilisateurs pour mon application Web. Plus précisément, j'utilise l'interface utilisateur hébergée de Cognito. Cela signifie que Cognito présente une interface utilisateur pour que mes utilisateurs puissent s'inscrire, je n'ai pas accès pour modifier les pages d'inscription ou de connexion de l'utilisateur pour mon application (autres que les contrôles fournis par Cognito). J'utilise des adresses e-mail comme noms d'utilisateur, il est donc simplement demandé aux nouveaux utilisateurs de fournir une adresse e-mail et un mot de passe.
Cognito traite les adresses e-mail comme sensibles à la casse. Si un utilisateur s'inscrit avec l'adresse e-mail [email protected], il ne peut pas se connecter à l'aide de [email protected].
Je souhaite que les adresses e-mail des utilisateurs pour l'inscription et la connexion ne respectent pas la casse.
Habituellement, cela serait trivial à gérer en définissant l'adresse e-mail en minuscules dans le client avant de l'envoyer au serveur. Cependant, je n'ai pas accès à l'interface utilisateur du client car elle est hébergée par Cognito.
Mon plan était donc d'essayer d'utiliser une fonction Lambda invoquée par un déclencheur de pré-inscription Cognito pour mettre en minuscule l'e-mail fourni par l'utilisateur.
Inscription préalable
Amazon Cognito invoque ce déclencheur lorsqu'un utilisateur tente de s'inscrire (s'inscrire), ce qui vous permet d'effectuer une validation personnalisée pour accepter ou refuser la demande d'enregistrement.
Voici la fonction lamdba que j'ai écrite:
'use strict';
console.log('Loading function');
exports.handler = (event, context, callback) => {
console.log('Received event:', JSON.stringify(event, null, 2));
var triggerSource = event.triggerSource;
console.log('Received triggerSource:', triggerSource);
var email = event.request.userAttributes.email;
console.log('Received email:', email);
var modifiedEvent = event;
if (email !== null) {
var lowerEmail = email.toLowerCase();
modifiedEvent.request.userAttributes.email = lowerEmail;
console.log('Set email in request to', lowerEmail);
console.log('Modified event:', JSON.stringify(modifiedEvent, null, 2));
} else {
console.log('Email evaluated as NULL, exiting with no action');
}
// Return result to Cognito
callback(null, modifiedEvent);
};
Cela "fonctionnait" dans le sens où l'adresse e-mail dans la demande d'événement a été modifiée pour être en minuscules ([email protected]). Cependant, il semble que le compte ait déjà été créé dans le pool d'utilisateurs au moment où ma fonction Lambda reçoit cet événement. La modification de l'adresse e-mail dans la demande n'a eu aucun effet - l'adresse e-mail d'origine ([email protected]) apparaît toujours dans mon groupe d'utilisateurs. Je soupçonne que les seuls champs dans le cas qui ont un effet sont les champs de réponse. Voici à quoi ressemble mon événement modifié:
{
"version": "1",
"region": "us-east-1",
"userPoolId": "us-east-1_xxxxxxx",
"userName": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
"callerContext": {
"awsSdkVersion": "aws-sdk-Java-console",
"clientId": "xxxxxxxxxxxxxxxxxxxxxx"
},
"triggerSource": "PreSignUp_SignUp",
"request": {
"userAttributes": {
"email": "[email protected]"
},
"validationData": null
},
"response": {
"autoConfirmUser": false,
"autoVerifyEmail": false,
"autoVerifyPhone": false
}
}
Je suis à la recherche d'idées ou d'exemples pour rendre mon inscription d'utilisateur et mon cas de connexion insensibles. Cela peut inclure des modifications de mon approche de déclenchement lambda ou autre chose.
Veuillez noter que je sais que je pourrais implémenter ma propre interface utilisateur, ce que je ne ferai qu'en dernier recours.
Vous pouvez déclencher une fonction Lambda après votre inscription pour changer l'e-mail en minuscules. Sans le tester, vous devriez pouvoir déclencher une confirmation Lambda après . Cette Lambda pourrait utiliser API AdminUpdateUserAttributes , appelée depuis le SDK de votre choix, pour changer l'e-mail en minuscules.
Notez que les noms d'utilisateur sont également sensibles à la casse.
Étant donné que le nom d'utilisateur est sensible à la casse: pourquoi ne pas simplement utiliser le nom d'utilisateur comme adresse e-mail et demander au pré-crochet de remplir le champ e-mail avec le nom d'utilisateur?