【问题标题】:Delete Firebase anonymous users after a while一段时间后删除 Firebase 匿名用户
【发布时间】:2016-10-20 02:34:31
【问题描述】:

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

【问题讨论】:

  • stackoverflow.com/a/39909854/2254886 我找到了一个可以让您的生活更轻松的解决方案。
  • 哈哈,好伙伴
  • 我在这里发布了它作为您问题的答案,但是社区删除了它,因为我把它放在了多个地方哈哈。可能是因为我在不止一个帖子上逐字发布了答案。我只是将答案更改为不同并重新发布。它可能会被删除,但我不确定这方面的规则,因为它现在在技术上是一个不同的答案。我不是想欺骗系统或任何东西,我只是想让人们看到解决方案。

标签: firebase angularfire firebase-authentication


【解决方案1】:

在您将匿名用户升级为非匿名用户之前,可以将其作为起点(想想一个电子商务网站,其中匿名用户将东西添加到他的购物车,然后在结帐时,升级为 Google 或电子邮件/密码用户; 在这种情况下,您可能不想丢失用户的购物车)。如前所述,如果您想将匿名用户的数据持久化给升级的用户,这可能会很有用。如果您希望清除匿名用户,则没有自动方法可以这样做。但是,一旦您退出匿名用户或登录非匿名用户,匿名用户的状态就会丢失。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          不知何故,有一种方法可以删除旧的匿名用户。我使用每小时运行的 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

          【讨论】:

          • 嗨 Kersten 您能否提供有关如何使用 npm 类的详细说明@beyond-agentur-ug/firebase-delete-inactive-users 我在 Functions 目录中发出以下命令:npm i - -save @beyond-agentur-ug/firebase-delete-inactive-users 我在 index.js 中添加了命令 export const removeOldUsers = functions.pubsub.topic( "hourly-tick" ).onPublish( event => { const inactiveUsers = new InactiveUsers(); return inactiveUsers.delete().then( ( deletedUsers ) => { console.log( Deleted ${deletedUsers.length} inactive users ); } ); } );
          • 但是当我尝试上传时,我得到了错误: export const removeOldUsers = functions.pubsub.topic( "hourly-tick" ).onPublish( event => { ^^^^^^ SyntaxError :在 Module._compile (module.js:599:28) 的 Object.runInThisContext (vm.js:139:10) 处的 createScript (vm.js:80:10) 处意外令牌导出
          • 嗨@LiveRock 看起来像一个 JS 错误。你能试试下面的吗? module.exports.removeOldUsers = 函数....
          • 对不起,我不确定你所说的 module.exports.removeOldUsers 是什么意思 = 我是新手,所以它应该在 index.js 中吗?有新手教程吗?
          • 云功能使用的是 JS 而不是 TS。然后你应该使用这个代码:module.exports.removeOldUsers = functions.pubsub.topic( "hourly-tick" ).onPublish( event =&gt; { const inactiveUsers = new InactiveUsers(); return inactiveUsers.delete().then( ( deletedUsers ) =&gt; { console.log( `Deleted ${deletedUsers.length} inactive users` ); } ); } );
          猜你喜欢
          • 1970-01-01
          • 2017-10-22
          • 2017-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-07
          • 1970-01-01
          • 2020-07-21
          相关资源
          最近更新 更多