如何批量删除Firebase匿名用户

时间:2016-09-22 13:34:09

标签: firebase firebase-authentication

由于我可能滥用匿名身份验证(请参阅How to prevent Firebase anonymous user token from expiring)我的应用中有很多匿名用户,我实际上并不想要。

我无法批量删除这些用户。我是否必须逐个手动完成?无论如何使用API​​来访问用户帐户并为当前用户以外的用户操作它们吗?

9 个答案:

答案 0 :(得分:8)

Firebase控制台无法批量删除用户。

没有用于批量删除用户的API。

但是有管理API允许您删除用户帐户。见https://firebase.google.com/docs/auth/admin/manage-users#delete_a_user

答案 1 :(得分:3)

我只是想添加一个我刚刚用于(排序)批量删除的方法。主要是因为我在做完之后觉得很聪明,而且我并不聪明。

我下载了一个鼠标自动化应用程序,可让您记录鼠标点击,然后自动重播。我刚刚弹钢琴时删掉了近1000名用户。

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

我知道这不是一个非常技术性的答案,但它节省了我小时的单调鼠标点击,所以希望其他寻找批量删除方式的人也会从中受益。我讨厌这样一个事实:没有批量删除,真的需要一种方法。它只花了大约20次手动删除才意识到有些应用可以做我正在做的事情。

答案 2 :(得分:3)

此代码示例使用Firebase Admin SDK for Node.js,并将删除任何没有提供者数据的用户,这意味着该用户是匿名的:

function deleteAnonymousUsers(nextPageToken) {
 adminApp
    .auth()
    .listUsers(20, nextPageToken)
    .then(function(listUsersResult) {
      listUsersResult.users.forEach(function(userRecord) {
        // updated condition from = 0 to === 0
        if (userRecord.providerData.length === 0) { //this user is anonymous
         console.log(userRecord); // do your delete here
         adminApp.auth().deleteUser(userRecord.uid)
            .then(function() {
                console.log("Successfully deleted user");
            })
            .catch(function(error) {
                console.log("Error deleting user:", error);
            });
        }
      });
      if (listUsersResult.pageToken) {
        // List next batch of users.
        deleteAnonymousUsers(listUsersResult.pageToken);
      }
    })
    .catch(function(error) {
      console.log('Error listing users:', error);
    });
}

答案 3 :(得分:1)

我今天遇到了同样的问题,然后找到了Firebase Admin SDK。我使用的Node.js非常容易安装,因此您可以尝试以下代码。这不是我知道的完整答案,但可以构建自己的脚本/应用程序来删除存储的uid。然而,没有办法检索列表,因此每次创建匿名帐户时都必须以某种方式构建一个列表。

首先,下载您可以通过Firebase控制台(项目设置)完成的'serviceAccountKey.json'。在我的情况下,我将下载文件重命名为更友好的名称并保存到文档文件夹。

  

console.firebase.google.com/project/的命名为yourprojectname /设置/ serviceaccounts / adminsdk

有用的链接:

然后,使用Windows cmd.exe或任何其他shell进行游戏。 'npm install -g'会在您的计算机上全局安装firebase-admin。

$ npm install firebase-admin -g
$ node
> var admin = require("firebase-admin");
> admin.initializeApp({
  credential: admin.credential.cert("./documents/yourprojectname-firebase-admin.json"),
  databaseURL: "https://yourprojectname.firebaseio.com"
});
> var db = admin.database();
// Of course use an existent UID of your choice
> admin.auth().getUser('2w8XEVe7qZaFn2ywc5MnlPdHN90s').then((user) => console.log
(user))
> admin.auth().deleteUser('2w8XEVe7qZaFn2ywc5MnlPdHN90s').then(function() {
    console.log("Successfully deleted user");
  }).catch(function(error) {
    console.log("Error deleting user:", error);
  });

// To get access to some key/values in your Database:
> var ref = db.ref("users/1234");
> ref.once("value", function(snapshot) {
  console.log(snapshot.val());
});

答案 4 :(得分:1)

我遇到了同样的问题。因为Firebase不提供任何API来删除批量用户,但这就是我删除所有匿名用户的方式。

通过firebase工具将所有用户下载为json firebase auth:export users --format = json
https://firebase.google.com/docs/cli/auth#file_format

您可以编写一个firebase云功能来触发或编写一个动作方法来触发

将json文件导入到您的文件中,

const Users = require('./users.json'); // ES5 <br>
import Users from './users.json'); // ES6 <br>

通常匿名用户没有电子邮件,因此很容易删除没有电子邮件ID的记录

Users.users.map(user => {
    setTimeout(() => {
      admin.auth().deleteUser(user.localId).then(() =>{
        console.log("Successfully deleted user");
      })
      .catch((error) => {
        console.log("Error deleting user:", error);
      });
    }, 20000);
  });

如果您遇到错误,请不要尝试减少超时。

Error deleting user: { Error: www.googleapis.com network timeout. Please try again.

答案 5 :(得分:1)

我正在使用 Firebase 身份验证为自己编写一个 Firebase 函数。 它对我来说就像一种魅力,我可以通过一个 API 调用来清理。

// Delete all Anon User
exports.deleteUser = functions.https.onRequest(async (req, res) => {
    const admin = require("firebase-admin");    

    //initialize auth
    admin.initializeApp(); 
    //create auth instance
    const auth = admin.auth();
    //Get the list of all Users
    const allUsers = await auth.listUsers();  
    //Identify the Anon User give other user null
    const allUsersUID = allUsers.users.map((user) => (user.providerData.length === 0) ? user.uid : null);
    //remove the null
    const filteredallUsersUID = allUsersUID.filter(e => e !== null)
    //delete and answer the API call
    return auth.deleteUsers(filteredallUsersUID).then(() => res.send("All Anon-User deleted"));

  });

有了这个,您只需调用您的 API URL https://[Your_API_URL]/deleteUser

只需要 Firebase 函数的基本知识。 我认为这也可以添加到 cron 作业中。

答案 6 :(得分:0)

有一个firebase-functions-helper包,可以帮助批量删除firebase用户。

// Get all users 
firebaseHelper.firebase
    .getAllUsers(100)    
    .then(users => {        
        users.map(user => {
            firebaseHelper.firebase
                .deleteUsers([user.uid]);          
        })   
    })

上面的代码将获得100个用户,并删除所有用户。如果您未传递该号码,则默认值为1000.您可以阅读Github repository上的说明。

答案 7 :(得分:0)

Firebase Admin SDK也可以一次delete multiple users

这是Node.js示例。

# Controller function
class WtfCtrl:
    def __init__(self, view):
        self.mainwindow = view
        self.connect_header_btns()

    # Here I connect the buttons of the main window   
    def connect_header_btns(self):
        self.mainwindow.infoScreen.clicked.connect(partial(self.show_info))

    # Here I show the info window
    def show_info(self):
        self.info_window = InfoWindow()
        self.info_window.show()

注意:list all users有一个限制。 每批允许删除的最大用户数为 1000

答案 8 :(得分:0)

2021 年更新:

我有大约 10,000 个匿名用户,@regretoverflow 的解决方案导致超出了删除用户配额。然而,稍微调整代码以利用管理员的 deleteUsers([userId1, userId2, ...]) API 就像一个魅力。

function deleteAnonymousUsers(nextPageToken: string | undefined) {
  firebaseAdmin
    .auth()
    .listUsers(1000, nextPageToken)
    .then(function (listUsersResult) {
      const anonymousUsers: string[] = [];
      listUsersResult.users.forEach(function (userRecord) {
        if (userRecord.providerData.length === 0) {
          anonymousUsers.push(userRecord.uid);
        }
      });

      firebaseAdmin
        .auth()
        .deleteUsers(anonymousUsers)
        .then(function () {
          if (listUsersResult.pageToken) {
            // List next batch of users.
            deleteAnonymousUsers(listUsersResult.pageToken);
          }
        })
    })
}
deleteAnonymousUsers(undefined);