如何在一定时间后自动删除AWS Cognito用户

问题描述

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

比方说,用户使用可能属于其他人的匿名电子邮件从客户端应用程序注册。如果电子邮件未通过验证,我希望在一段时间后自动将其删除。这样,它将允许电子邮件的实际所有者进行注册。我该怎么办?

解决方法

没有任何东西可以自动通过您的用户池并为单个用户做一些维护。我认为一种更可扩展的解决方案是创建3个Lambda函数。首先是pre sign-up lambda,它将新用户存储在例如DynamoDB表中。来自文档的流程如下所示:

enter image description here

每次用户注册时,都会将新创建的用户的电子邮件地址以及时间戳记存储在表中。

在第二个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