一段时间后删除Firebase匿名用户

时间:2016-06-18 09:25:25

标签: firebase angularfire firebase-authentication

我正在使用匿名身份验证,以允许我的用户无需登录即可使用该应用。但是,Firebase似乎无限期地保留这些匿名用户ID。有没有办法自动清除这些或设置某种过期规则?我不希望这些一次性使用ID永远存在,并使来自提供商的实际用户数据混乱。

5 个答案:

答案 0 :(得分:6)

不幸的是,这是一个"内存泄漏" (用户泄漏?)由于没有合理的方法强制匿名用户进行转换,这些匿名用户ID很快就会变成没有特定目的的僵尸(我能想到)。此外,单个真实用户可能(忘记地)以匿名用户身份登录,再次,在将他们的电子邮件链接到之前的版本之后,然后在尝试链接到他们的电子邮件时感到沮丧。总的来说,我发现当前的匿名用户实现不切实际,或者至少远非理想。

目前我计划为一个给定用户/设备提供一个随机但唯一的电子邮件地址,用于登录匿名用户,而不是使用内置匿名登录(已禁用)。在我看来,需要设置一个设置来告诉Firebase在注销时删除匿名用户ID(无论如何它们都无用)和/或在预定义的时间之后。此外,能够使用相同的匿名用户ID再次登录,直到到期时间(例如通过保存令牌等)可能是有用的。最后,尝试链接已经在使用的电子邮件应该只需通过验证步骤将匿名用户ID与现有的电子邮件/密码用户ID合并。

答案 1 :(得分:2)

您可以使用Firebase的admin API以编程方式删除用户。您需要在数据库中存储用户列表,因为Firebase不会为此提供查询。

答案 2 :(得分:1)

没有办法批量删除,但是,以下技巧对我有用:

我使用了Macro Recorder,它就像一个魅力。只是在我的控制台中记录了一些删除用户的迭代,将其设置为重复500次并走开。

答案 3 :(得分:1)

某种程度上,有一种删除旧匿名用户的方法。我通过每小时运行一次的AppEngine cronjob来做到这一点。

但是在执行此操作之前,您必须定义什么是匿名用户。我的用户必须验证其电子邮件地址,因此我将90天后所有未经验证的用户声明为匿名。

然后用PubSub勾号收集所有用户并将其删除,这里有一个示例:

export const removeOldUsers = functions.pubsub.topic( "hourly-tick" ).onPublish( event => {
    function getInactiveUsers( users: Array<UserRecord> = [], nextPageToken?: string ) {
        let userList = users;

        return admin.auth().listUsers( 1000, nextPageToken ).then( ( result: any ) => {
            console.log( `Found ${result.users.length} users` );

            const inactiveUsers = result.users.filter( ( user ) => {
                return moment( user.metadata.lastSignInTime ).isBefore( moment().subtract( 90, "days" ) ) && !user.emailVerified;
            } );

            console.log( `Found ${inactiveUsers.length} inactive users` );

            // Concat with list of previously found inactive users if there was more than 1000 users.
            userList = userList.concat( inactiveUsers );

            // If there are more users to fetch we fetch them.
            if ( result.pageToken) {
                return getInactiveUsers( userList, result.pageToken );
            }

            return userList;
        } );
    }

    return new Promise( ( resolve ) => {
        console.info( `Start deleting user accounts` );

        getInactiveUsers().then( ( users ) => {
            resolve( users );
        } );
    } ).then( ( users: Array<UserRecord> ) => {
        console.info( `Start deleting ${users.length} user accounts` );

        return Promise.map( users, ( user ) => {
            return admin.auth().deleteUser( user.uid ).then( () => {
                console.log( "Deleted user account", user.uid, "because of inactivity" );
            } ).catch( ( error ) => {
                console.error( "Deletion of inactive user account", user.uid, "failed:", error );
            } );
        }, { concurrency: 3 } );
    } ).then( () => {
        console.info( `Done deleting user accounts` );
    } );
} );

在这里,我只是将我的课程推到了npmjs @beyond-agentur-ug/firebase-delete-inactive-users

答案 4 :(得分:0)

匿名用户可以在将其升级为非匿名用户之前作为起点(想想一个匿名用户将东西添加到购物车然后结帐,升级到Google或电子邮件/密码用户的电子商务网站;在这种情况下,您可能不想丢失用户的购物车)。如上所述,如果要将数据从匿名用户持久保存到升级用户,这可能很有用。如果您希望清除匿名用户,则无法自动执行此操作。但是,只要您注销匿名用户或登录非匿名用户,匿名用户的状态就会丢失。