#amazon-web-services #amazon-cognito #aws-userpools
#amazon-веб-сервисы #amazon-cognito #aws-userpools
Вопрос:
Я хотел бы удалить неподтвержденного пользователя из пула пользователей AWS Cognito через определенное время. Возможно ли автоматически удалить пользователя Cognito?
Допустим, пользователь регистрируется из клиентского приложения с помощью анонимного электронного письма, которое может принадлежать кому-то другому. Если электронное письмо не проверено, мне нравится удалять его автоматически через определенное время. Таким образом, это позволит фактическому владельцу электронной почты зарегистрироваться. Как я могу это сделать?
Ответ №1:
Нет ничего, что автоматически проходит через ваш пул пользователей и выполняет какое-либо обслуживание отдельных пользователей. Одним из вариантов, который я считаю более масштабируемым решением, было бы создание 3 лямбда-функций. Первый — это лямбда-выражение для предварительной регистрации, которое сохраняет новых пользователей, например, в таблице DynamoDB. Поток, взятый из документов, выглядит следующим образом:
Каждый раз, когда пользователь регистрируется, сохраняйте адреса электронной почты вновь созданных пользователей в таблице вместе с отметкой времени.
Во втором лямбда-выражении у вас будет лямбда-сообщение с подтверждением, которое запускается, когда пользователи подтверждают свой адрес электронной почты. Это лямбда-выражение удалит все подтвержденные адреса электронной почты из таблицы DynamoDB.
Наконец, в третьем лямбда-выражении у вас будет событие CloudWatch, которое будет запускать лямбду (некоторые подробности см. В Этом руководстве) периодически (ежедневно? еженедельно?) Это ваша лямбда «очистки». Для всех адресов электронной почты, которые остаются в таблице DynamoDB и которые старше вашего ограничения для проверки электронной почты, теперь будет удалена запись пула пользователей Cognito.
Я знаю, это может показаться немного сложным, но на самом деле вы можете проверять каждую лямбду самостоятельно и разрабатывать по одному за раз. Сначала можно создать лямбда-код предварительной регистрации, чтобы ввести новых пользователей. Вы можете убедиться, что это работает, и даже вручную удалить пользователей, которые не подтвердили. Второй способ на самом деле довольно прост, просто удалите строку в таблице. Последнее немного сложнее: выбираются все «старые» регистрации, удаляются из Cognito, а затем удаляются из базы данных.
Альтернативой является запуск события CloudWatch с помощью одного лямбда-выражения, которое перебирает всех пользователей в вашем пуле пользователей Cognito и проверяет, были ли они проверены. Это нормально, возможно, для 1000 пользователей. Но что, если вы очень успешны и у вас несколько миллионов пользователей? С очень большим процентом пользователей не нужно ничего делать, но вам все равно придется обрабатывать запись.
Комментарии:
1. Спасибо за решение. Я попробую.
Ответ №2:
Другой способ сделать это — синхронизировать вашу UserPool
базу данных с внешней базой данных, такой как DyanmoDB
, которая поддерживает концепцию a TTL
. Когда пользователи не подтверждены TTL
, существует атрибут, например (30 дней). Если пользователь подтвердит себя, вы можете удалить TTL
атрибут, и его запись не будет удалена.
Чтобы синхронизировать операцию удаления с вашей UserPool
, вы можете включить DynamoDB
потоки и прослушать операции удаления, а затем вызвать пользователя удаления в Cognito
API.
Я не знаю, можете ли вы просто выполнить CloudWatch
правило, поскольку это может потребовать от вас сканирования всех пользователей, если вы не можете выполнить поиск по дате создания.
Вам также необходимо учитывать вашу архитектуру, если вам действительно нужно это сделать, и если да, будет ли у вас много пользователей, которые будут удалены внезапно? Затем вам нужно будет ограничить удаление вызовов с помощью очереди и т. Д. Если у вас не так много пользователей, возможно, вы сможете разбить их на страницы и избежать необходимости поддерживать базу данных и потоки, что будет стоить вам денег.
Комментарии:
1. У меня недостаточно знаний о потоках DynamoDB, но я обязательно посмотрю. Спасибо.
Ответ №3:
Вам необходимо назначить триггер Lambda, Lambda Amazon EventBridge (триггер для просмотра в облаке)
Код Js узла:
const AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider({region:'Region-ID'});
const userPoolID = "User Pool ID";
const getUsers = async =>{
return await new Promise((resolve, reject)=>{
const params = {
UserPoolId:userPoolID,
Filter:"cognito:user_status = "UNCONFIRMED"",
Limit:10
}
cognito.listUsers(params,(err,data)=>{
if(err){
reject(err)
}else{
const users = data.Users
users.forEach(user=>deleteUser(user.Username))
}
})
})
}
const deleteUser = async (sub)=>{
return await new Promise((resolve, reject)=>{
const params = {
UserPoolId:userPoolID,
Username:sub
}
cognito.adminDeleteUser(params,(err,data)=>{
if(err){
reject(err)
}else{
resolve(data)
}
})
})
};
const main= async (event)=>{
return getUsers()
}
exports.handler = main
Комментарии:
1. Необходимо настроить роль выполнения Lambda: разрешить журналы AmazonCognitoPowerUser и awsopsworkscloudwatchlougs