Возможно ли изменить атрибуты пользователя AWS Cognito в триггерах Lambda

Взглянув на документацию AWS,

https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax- предварительно регистрация

у вас есть следующие параметры, доступные в функции Pre-up- lambda:

"request": {
  "userAttributes": {
    "string": "string",
    ....
},
"validationData": {<validation data as key-value (String, String) pairs, from the client>}

Есть ли способ изменить или добавить дополнительные userAttributes объект события?

например:

// Modify an existing username...
event.request.userAttributes.name.ucfirst();

// Add an additional attribute...
event.request.userAttributes.nickname = "ANY_NAME";


callback(null, event);

Ответ 1

Да, там абсолютно способ! Вам нужно использовать AWS javascript SDK в вашем 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) {
    ...
  }
);

Убедитесь, что для вашей функции Lambda заданы правильные политики (т.е. Разрешено действие "cognito-idp: AdminUpdateUserAttributes"), а для пула пользователей определен атрибут.

Ответ 2

В процессе регистрации нет способа изменить атрибуты/дополнительные атрибуты, но во время входа вы можете мутировать/расширять их с помощью pre-token триггер генерации.

Ответ 3

Для тех, кто хочет разобраться в этом вопросе, ниже приведен пример

Лямбда-функция № 1 ниже принимает два пользовательских атрибута ida и ethaddress. Лямбда вызывается во время PreSignUpHook для пулов пользователей Cognito

# 2 (До того, как события изменили журналы), исходные значения для этих атрибутов - ida=1 и ethaddress=ABCD

№ 3 (после изменений журнала событий) отражает измененные значения этих атрибутов: ida=2 и ethaddress=EFGH

Однако значения, сохраненные в Cognito, являются исходными: ida=1 и ethaddress=ABCD. Поэтому обновление userAttributes во время presignuphook НЕ работает, как предлагается в некоторых ответах.

Обратите внимание, что при изменении предопределенных атрибутов в объекте ответа они обновляются, как и ожидалось:

"response": {
    "autoConfirmUser": true,
    "autoVerifyEmail": false,
    "autoVerifyPhone": false
}
1. ЛАМБДА:
'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);
 };
2.

ПЕРЕД ИЗМЕРЕНИЕМ ЖУРНАЛА:

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
    }
}
3

ПОСЛЕ ЖУРНАЛА ИЗМЕНЕНИЯ СОБЫТИЙ:

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

UPDATE:

Кажется, что нет способа сделать это как часть процесса PRESIGNUP Однако это можно сделать как триггер POSTCONFIRMATION в приведенном ниже примере cognito.

На некоторые вещи стоит обратить внимание.

  1. Пользовательский атрибут добавлен в Cognito и является изменяемым.
  2. в клиенте приложения → показать детали → "Задать права на чтение и запись атрибута" Убедитесь, что в настраиваемом атрибуте есть разрешения на чтение и запись.
  3. Убедитесь, что лямбда-функция имеет ROLE, который позволяет ей выполнять: adminUpdateUserAttributes Например. Присоедините политику AmazonCognitoPowerUser к LambaRole.
module.exports.postConfirmation = async (event, context,callback) => {
        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);

};

Обратите внимание, если вы попытаетесь использовать cognitoIdServiceProvider.adminUpdateUserAttributes в триггере preSignUp, вы получите исключение, сообщающее, что пользователь еще не вышел

Ответ 4

Ну, простое решение было бы так, добавив это к "Pre-Sign-up Lambda function", взяв реплику из вашего кода:

// Modify an existing username...
 event['request']['userAttributes']['name'] = "My_NAME";

// Add an additional attribute...
 event['request']['userAttributes']['custom:sillyname'] = "ANY_NAME";

 callback(null, event);

Учитывая, что вы добавили атрибут custom:sillyname для пула пользователей.