【发布时间】:2020-10-29 00:14:15
【问题描述】:
我想在一定时间后从 AWS Cognito 用户池中删除一个未经验证的用户。是否可以自动删除 Cognito 用户?
假设用户使用可能属于其他人的匿名电子邮件从客户端应用注册。如果电子邮件未经过验证,我喜欢在一定时间后自动删除它。这样,它将允许电子邮件的实际所有者进行注册。我该怎么做?
【问题讨论】:
标签: amazon-web-services amazon-cognito aws-userpools
我想在一定时间后从 AWS Cognito 用户池中删除一个未经验证的用户。是否可以自动删除 Cognito 用户?
假设用户使用可能属于其他人的匿名电子邮件从客户端应用注册。如果电子邮件未经过验证,我喜欢在一定时间后自动删除它。这样,它将允许电子邮件的实际所有者进行注册。我该怎么做?
【问题讨论】:
标签: amazon-web-services amazon-cognito aws-userpools
没有任何东西会自动通过您的用户池并对单个用户进行一些维护。我认为一种更具可扩展性的解决方案是创建 3 个 Lambda 函数。第一个是pre sign-up lambda,它将新用户存储在例如 DynamoDB 表中。来自文档的流程如下所示:
每次用户注册时,都会将新创建用户的电子邮件地址连同时间戳一起存储到一个表中。
在第二个 Lambda 中,您将拥有一个 post confirmation lambda,当人们确认他们的电子邮件地址时运行它。该 Lambda 将从 DynamoDB 表中删除所有已确认的电子邮件地址。
最后,在第三个 Lambda 中,您将有一个 CloudWatch 事件定期(每天?每周?)运行 Lambda(有关详细信息,请参阅this tutorial)这是您的“清理”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(云手表触发器)
节点 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
【讨论】: