En consultant la documentation AWS,
les paramètres suivants sont disponibles dans la fonction pré-inscription Lambda:
"request": {
"userAttributes": {
"string": "string",
....
},
"validationData": {<validation data as key-value (String, String) pairs, from the client>}
existe-t-il un moyen de modifier ou d’ajouter userAttributes l’objet événement?
par exemple:
// Modify an existing username...
event.request.userAttributes.name.ucfirst();
// Add an additional attribute...
event.request.userAttributes.nickname = "ANY_NAME";
callback(null, event);
Oui, il y a absolument un moyen! Vous devez utiliser le kit SDK javascript AWS dans votre gestionnaire Lambda:
const AWS = require('aws-sdk');
AWS.config.update({region: 'ap-southeast-1'});
const cognitoidentityserviceprovider =
new AWS.CognitoIdentityServiceProvider({
apiVersion: '2016-04-18'
});
cognitoidentityserviceprovider.adminUpdateUserAttributes(
{
UserAttributes: [
{
Name: 'YOUR_USER_ATTRIBUTE_NAME',
Value: 'YOUR_USER_ATTRIBUTE_VALUE'
}
],
UserPoolId: event.userPoolId,
Username: event.userName
},
function(err, data) {
...
}
);
Assurez-vous de donner les bonnes politiques à votre fonction Lambda (c'est-à-dire qu'elle autorise l'action "cognito-idp: AdminUpdateUserAttributes") et que le groupe d'utilisateurs a l'attribut défini.
Il n’existe pas de moyen de muter/augmenter les attributs lors de l’inscription, mais lors de la connexion, vous pouvez les muter/augmenter avec le déclencheur génération de pré-jeton .
Pour tous ceux qui s'intéressent à cette question, voici un exemple ci-dessous.
La fonction lambda n ° 1 ci-dessous prend en deux attributs personnalisés ida
et ethaddress
. Le lambda est appelé lors du pool d'utilisateurs PreSignUpHook for Cognito
N ° 2 (journaux d'événement modifiés avant), les valeurs d'origine de ces attributs sont ida=1
et ethaddress=ABCD
# 3 (Les journaux modifiés après l'événement) reflètent les valeurs modifiées de ces attributs: ida=2
et ethaddress=EFGH
Cependant, les valeurs enregistrées dans cognito sont les valeurs d'origine: ida=1
et ethaddress=ABCD
. Par conséquent, la mise à jour de UserAttributes pendant le présignage ne fonctionne PAS comme suggéré dans certaines des réponses.
Dans une note parallèle, lorsque les attributs prédéfinis dans l'objet de réponse sont modifiés, ils sont mis à jour comme prévu:
"response": {
"autoConfirmUser": true,
"autoVerifyEmail": false,
"autoVerifyPhone": false
}
'use strict';
global.fetch = require('node-fetch')
module.exports.preSignUp = async (event, context, callback) => {
// Set the user pool autoConfirmUser flag after validating the email domain
let data = await fetch("http://***.***.***/api/members/create",
{
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
method: "POST",
})
.then(res => res.json())
.then(res => res);
event.response.autoConfirmUser = true;
console.log('before event:', JSON.stringify(event));
event.request.userAttributes['custom:ethaddress'] = String(data.address);
event.request.userAttributes['custom:ida'] = "2";
console.log('Received event:', JSON.stringify(event));
console.log('Address:', data.address);
// Return to Amazon Cognito
callback(null, event);
};
AVANT DE CHANGER LE JOURNAL DE L’ÉVÉNEMENT:
2019-01-20T01:02:24.639Z edce636e-75ea-492b-b6a0-dd4f22dc9038 before event:
{
"version": "1",
"region": "us-east-1",
"userPoolId": "us-east-1-*****",
"userName": "*******@gmail.com",
"callerContext": {
"awsSdkVersion": "aws-sdk-unknown-unknown",
"clientId": "******************"
},
"triggerSource": "PreSignUp_SignUp",
"request": {
"userAttributes": {
"custom:ida": "1",
"custom:ethaddress": "ABCD",
"email": "*******@gmail.com"
},
"validationData": {}
},
"response": {
"autoConfirmUser": true,
"autoVerifyEmail": false,
"autoVerifyPhone": false
}
}
JOURNAL DE CHANGEMENT APRES EVENEMENT:
Received event:
{
"version": "1",
"region": "us-east-1",
"userPoolId": "us-east-1_0BaE6eaTY",
"userName": "*******@gmail.com",
"callerContext": {
"awsSdkVersion": "aws-sdk-unknown-unknown",
"clientId": "*****************"
},
"triggerSource": "PreSignUp_SignUp",
"request": {
"userAttributes": {
"custom:ida": "2",
"custom:ethaddress": "EFGH",
"email": "*******@gmail.com"
},
"validationData": {}
},
"response": {
"autoConfirmUser": true,
"autoVerifyEmail": false,
"autoVerifyPhone": false
}
}
METTRE À JOUR:
Il semble qu'il n'y ait aucun moyen de faire cela dans le cadre du processus PRESIGNUP Cependant, il est possible de le faire comme déclencheur POSTCONFIRMATION dans l'exemple de cognito fourni ci-dessous.
Certaines choses à surveiller.
module.exports.postConfirmation = async (événement, contexte, rappel) => {
const cognitoIdServiceProvider = new CognitoIdentityServiceProvider({
region: 'us-east-1'
});
var params = {
UserAttributes: [
{
Name: 'custom:sillyName',
Value: 'customSillyName'
}
],
UserPoolId: event.userPoolId,
Username: event.userName
}
cognitoIdServiceProvider.adminUpdateUserAttributes(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
callback(null,event);
};
Notez que si vous essayez d'utiliser cognitoIdServiceProvider.adminUpdateUserAttributes
dans le hook de trigger preSignUp, vous aurez une exception disant que l'utilisateur ne se ferme pas encore.