【问题标题】:How to delete a AWS Cognito user automatically after certain time如何在特定时间后自动删除 AWS Cognito 用户
【发布时间】:2020-10-29 00:14:15
【问题描述】:

我想在一定时间后从 AWS Cognito 用户池中删除一个未经验证的用户。是否可以自动删除 Cognito 用户?

假设用户使用可能属于其他人的匿名电子邮件从客户端应用注册。如果电子邮件未经过验证,我喜欢在一定时间后自动删除它。这样,它将允许电子邮件的实际所有者进行注册。我该怎么做?

【问题讨论】:

    标签: amazon-web-services amazon-cognito aws-userpools


    【解决方案1】:

    没有任何东西会自动通过您的用户池并对单个用户进行一些维护。我认为一种更具可扩展性的解决方案是创建 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 个用户就可以了。但是如果你超级成功并且拥有几百万用户怎么办?很大一部分用户不需要对他们做任何事情,但您仍然需要处理记录。

    【讨论】:

    • 感谢您的解决方案。我会试一试的。
    【解决方案2】:

    另一种方法是将UserPoolDyanmoDB 等外部数据库同步,它支持TTL 的概念。当未确认用户时,TTL 属性存在,例如(30 天)。如果用户确实确认了自己,您可以删除 TTL 属性,他们的条目不会被删除。

    要将删除操作同步回您的UserPool,您可以启用DynamoDB 流,并监听删除操作,然后在Cognito API 中调用删除用户。

    我不知道您是否可以简单地执行CloudWatch 规则,因为如果您无法按创建日期搜索,这可能需要您扫描所有用户。

    您还需要考虑您的架构,如果您真的需要这样做,如果需要,您是否会突然删除很多用户?然后你需要用队列等来限制删除调用。如果你没有很多用户,也许你可以对它们进行分页,避免需要建立一个数据库和流,这会花费你的钱。

    【讨论】:

    • 我没有足够的关于 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

    【讨论】:

    • Lambda 执行角色需要设置:允许 AmazonCognitoPowerUser 和 AWSOpsWorksCloudWatchLogs
    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 2021-10-05
    • 2022-07-19
    • 2018-12-20
    • 1970-01-01
    • 2019-03-02
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多