Возможно ли изменить атрибуты пользователя 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.
На некоторые вещи стоит обратить внимание.
- Пользовательский атрибут добавлен в Cognito и является изменяемым.
- в клиенте приложения → показать детали → "Задать права на чтение и запись атрибута"
Убедитесь, что в настраиваемом атрибуте есть разрешения на чтение и запись.
- Убедитесь, что лямбда-функция имеет 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
для пула пользователей.