web-dev-qa-db-fra.com

Est-il possible de modifier les attributs d'utilisateur AWS Cognito dans les déclencheurs Lambda

En consultant la documentation AWS,

https://docs.aws.Amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html#cognito-user-pools-lambdafrtrger syntaxe-pré-inscription

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);
9
dieheld

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.

5
Khoi

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

3
behrooziAWS

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.

  1. l'attribut personnalisé a été ajouté dans cognito et est modifiable.
  2. dans le client d'application -> Afficher les détails -> "Définir les autorisations de lecture et d'écriture des attributs" Assurez-vous que les attributions suivantes sont en lecture et en écriture sur l'attribut personnalisé.
  3. Assurez-vous que la fonction lambda a un ROLE qui lui permet d’exécuter: adminUpdateUserAttributes E.g. Associez la stratégie AmazonCognitoPowerUser à LambaRole.

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.

0
Shivam Sinha