问题描述
我想在一段时间后从AWS Cognito用户池中删除未验证的用户。是否可以自动删除Cognito用户?
比方说,用户使用可能属于其他人的匿名电子邮件从客户端应用程序注册。如果电子邮件未通过验证,我希望在一段时间后自动将其删除。这样,它将允许电子邮件的实际所有者进行注册。我该怎么办?
解决方法
没有任何东西可以自动通过您的用户池并为单个用户做一些维护。我认为一种更可扩展的解决方案是创建3个Lambda函数。首先是pre sign-up lambda,它将新用户存储在例如DynamoDB表中。来自文档的流程如下所示:
每次用户注册时,都会将新创建的用户的电子邮件地址以及时间戳记存储在表中。
在第二个Lambda中,您将有一个post confirmation lambda,当人们确认其电子邮件地址时,该this tutorial将运行。该Lambda将从DynamoDB表中删除所有已确认的电子邮件地址。
最后,在第三个Lambda中,您将有一个CloudWatch事件(定期(每天?每周?)运行Lambda(有关此操作的详细信息,请参见Enable Wholesale prices in Woocommerce 3)。这是您的“清理” Lambda。现在,DynamoDB表中保留的,比截止日期还早的任何电子邮件地址都将被删除,其Cognito用户池记录也将被删除。
我知道这听起来有些挑战,但实际上您可以自行验证每个Lambda并一次开发一个。可以先创建预注册Lambda,以吸引新用户。您可以确保可以正常工作,甚至可以手动删除尚未确认的用户。第二个实际上非常简单,只需删除表中的一行即可。最后一个涉及更多,选择所有“旧”注册,将其从Cognito中删除,然后从数据库中删除。
另一种方法是让CloudWatch事件运行一个Lambda,该Lambda遍历Cognito用户池中的每个用户,并检查是否已通过验证。可能有1000位用户。但是,如果您超级成功并且拥有数百万个用户,该怎么办?很大一部分用户不需要对他们做任何事情,但是您仍然必须处理记录。
,执行此操作的另一种方法是将UserPool
与外部数据库(例如DyanmoDB
)进行同步,该外部数据库确实支持TTL
的概念。如果未确认用户,则存在TTL
属性,例如(30天)。如果用户确认自己的身份,则可以删除TTL
属性,其条目不会被删除。
要将删除操作同步回UserPool
,您可以启用DynamoDB
流,并监听删除操作,然后在Cognito
API中调用删除用户。
我不知道您是否可以简单地执行CloudWatch
规则,因为如果您无法按创建日期进行搜索,这可能会要求您扫描所有用户。
您还需要考虑您的体系结构,如果您确实需要这样做,那么,是否会突然删除许多用户?然后,您将需要使用队列等来限制删除呼叫。如果您没有很多用户,也许您可以对它们进行分页,而无需建立数据库和流,这将花费您的钱。
,您需要分配Lambda触发器,Lambda + Amazon EventBridge(云监视触发器)
Node 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,Username:sub
}
cognito.adminDeleteUser(params,data)=>{
if(err){
reject(err)
}else{
resolve(data)
}
})
})
};
const main= async (event)=>{
return getUsers()
}
exports.handler = main