从Firebase身份验证控制台中删除所有用户

84

有没有一种简单的方法可以从Firebase控制台中删除所有已注册用户?例如,我在开发环境中创建了一百个用户,现在我想删除它们所有。

有没有一种简单的方法可以从Firebase控制台中删除所有已注册用户?例如,我在开发环境中创建了一百个用户,现在我想删除它们所有。
33个回答

115

在更新的回答中,现在你可以使用Firebase管理工具,但如果你不想使用,这里是一些更为可靠的JavaScript代码,用于在Web上删除用户:

var intervalId;

var clearFunction = function() {
  var size = $('[aria-label="Delete account"]').size()
  if (size == 0) {
    console.log("interval cleared")
    clearInterval(intervalId)
    return
  }
  var index = Math.floor(Math.random() * size)
  $('[aria-label="Delete account"]')[index].click();
  setTimeout(function () {
     $(".md-raised:contains(Delete)").click()
  }, 1000);
};

intervalId = setInterval(clearFunction, 300)

只需在开发者工具中运行它


4
可以这样做,但确保在运行时保持选项卡打开,不要切换到其他选项卡。 - KrauseFx
你怎么在开发者工具中运行它?我把它粘贴到控制台了。还需要做些什么吗? - Praxiteles

79

针对新的Firebase更新

尝试使用以下代码进行最新的Firebase更新。 打开控制台,粘贴此代码并按回车键!!!

setInterval(() => {
    document.getElementsByClassName('edit-account-button mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base')[0].click()
    Array.from(document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted')).at(-1).click();
    document.getElementsByClassName('confirm-button mat-focus-indicator mat-raised-button mat-button-base mat-warn')[0].click()
}, 1000)

9
非常好,谢谢!只需注意:如果列表中有匿名账户,请将第二个“getElementsByClassName”的索引从2更改为1。此外,您可以设置更短的间隔,我使用了500。 - the korovay
3
谢谢夸奖 : )。这在2021年4月21日有效。 - Reinis
1
我通过将第二个命令的索引从2更改为1使其正常工作。 => document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted')[1].click() - Yunus Yurtturk
2
@GregSadetsky 2022* - Yaman KATBY
2
这是一些美妙的黑客技巧。截至2022年2月21日仍在工作。 - Aezur
显示剩余8条评论

44
因为我懒得在用户界面中点击按钮和元素,所以我设置了一个小的客户端脚本:

$('[aria-label="Delete account"]').click()
setTimeout(function () {
   $(".md-raised:contains(Delete)").click()
}, 1000);

你可能需要多次运行它,但这比手动在屏幕上点击东西浪费时间要好得多。


1
谢谢,这真的很有帮助 :) - Luis Mejía F.
哟,非常有用的兄弟) - Mark Okhman
3
打开浏览器的开发者工具(右键点击页面,选择“检查”或“检查元素”),然后转到“控制台”选项卡,并粘贴代码,最后按下“回车”键。 - Ionică Bizău
@mjpablo23 只需在页面的任何位置右键单击即可。 - Ionică Bizău
出现了 TypeError: null 不是一个对象(在执行 '$('[aria-label="Delete account"]').click' 时)- 有什么建议吗? - Praxiteles
显示剩余6条评论

30

使用Firebase Admin SDK的完整可用解决方案

使用Firebase Admin SDK非常容易,也是在Firebase数据上执行此类任务的推荐方法。这个解决方案不同于使用开发者控制台的其他临时解决方案。

我刚刚编写了一个Node.js脚本,用于删除Firebase身份验证中的所有用户。我已经通过删除大约10000个用户来测试它。我只需要运行以下Node.js代码即可。

设置Firebase Admin SDK

创建一个新文件夹。在终端中运行以下命令:

npm init
sudo npm install firebase-admin --save

现在在该文件夹中创建一个 index.js 文件。

按照以下步骤进行:

  • 转到您的Firebase项目->项目设置->服务帐户。
  • 单击生成新的私有密钥以下载JSON文件。将JSON文件的路径复制并替换下面代码中服务帐户私有密钥JSON文件的路径。
  • 还要从设置页面复制databaseURL。将其替换为代码中的内容。
  • 将代码复制并粘贴到index.js中。
  • 在终端中运行node index.js。看着混乱发生吧!
var admin = require('firebase-admin');

var serviceAccount = require("/path/to/service/accounts/private/key/json/file");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "/url/to/your/database"
});

function deleteUser(uid) {
    admin.auth().deleteUser(uid)
        .then(function() {
            console.log('Successfully deleted user', uid);
        })
        .catch(function(error) {
            console.log('Error deleting user:', error);
        });
}

function getAllUsers(nextPageToken) {
    admin.auth().listUsers(100, nextPageToken)
        .then(function(listUsersResult) {
            listUsersResult.users.forEach(function(userRecord) {
                uid = userRecord.toJSON().uid;
                deleteUser(uid);
            });
            if (listUsersResult.pageToken) {
                getAllUsers(listUsersResult.pageToken);
            }
        })
        .catch(function(error) {
            console.log('Error listing users:', error);
        });
}

getAllUsers();

1
这对我有用。但是我现在被阻止了,API不允许我删除超过8,000个用户。 - Jorsh
很高兴它起作用了。然而,当我尝试时,并没有遇到任何阻止或限制的情况。 - Sunit Gautam
不错。这里在删除了约100个后就抱怨达到了限制,但只需再次执行即可完成所有删除。我建议在cred.json文件上使用.gitignore。 - Henrique Bruno
@Jorsh 如果你想避免限制,那么在调用getAllUsers时简单的超时设置可以帮助解决问题: setTimeout(() => { getAllUsers(listUsersResult.pageToken) }, 6000); - Karol Be
这是一个Gist,你可以保存它: https://gist.github.com/joshpetit/b6cf918a9beac1f4e86270475a61cb11 - joshpetit
显示剩余2条评论

27
setInterval(() => {
  $('[aria-label="Delete account"]').first().click()
  setTimeout(()=>{
    $(".md-raised:contains(Delete)").click()
  }, 100)
}, 2000);

旨在避免频繁调用 delete 端点,因为 Google 会返回 404 错误。


3
啊哈哈哈,很高兴你玩得开心。 - Eugene Hauptmann
1
我因为网络慢,所以不得不设置5000的间隔。 - Murtuza
很酷,@Murtuza,理想情况下,它应该在XHR请求完成时链接到事件处理程序。 - Eugene Hauptmann
1
我喜欢这个解决方案!不过我要添加一个if语句来计算是否需要跳转到下一页。 - Chris
1
@www.eugenehp.tk 已发布 :) - Chris
显示剩余3条评论

20

2016-11-08更新 以下是原始回答内容

我们刚刚发布了Firebase管理SDK,它支持管理用例,例如删除用户帐户而无需该用户先进行登录

原始回答

当前Firebase身份验证中没有API可让您在不要求该用户登录的情况下删除用户。我们知道这限制了我们的API的可用性,并正在努力在未来发布中添加此功能。但通常情况下,我们不会提供特定功能可用的时间表。

目前你唯一的解决方法是:

  • 作为应用程序中的每个测试用户进行登录,并从那里删除用户
  • 从Firebase控制台逐个删除每个用户

24
请问您能否考虑在Firebase控制台中使用“Shift”+ 点击“删除账户”时,删除确认提示的功能。这样可以模仿数据库的行为,并且可以显著加快操作速度。 - DrZaphod
我能否在App Engine中“以每个测试用户的身份登录”,而无需使用浏览器?我是否可以通过某种方式直接从App Engine中删除用户,或通过某些Web服务进行删除? - makkasi
在NodeJs的firebase-admin SDK中,是否没有一种方法可以获取所有用户,然后对于每个用户执行admin.auth().deleteUser(uid);操作? - Snewedon
@Frank van Puffelen 我看到没有 Python 的管理 SDK。是否有一些方法可以在 Python 中使用 nodeJS 管理 SDK? - makkasi
很高兴知道现在可以通过Firebase Admin SDK实现这一点。如果这些也可以上传并用作Google HTTPS函数,那就太酷了!TIA! - raiser00

7
稍微增强了您的助手脚本。
德语Firebase网站版本:
$('[aria-label="Nutzermenü öffnen"]').click();
$('[aria-label="Konto löschen"]').click();
for (i = 0; i < 20; i++) {
  setTimeout(() => {
    $('.md-raised:contains(Löschen)').click();
  }, i * 200);
}

只需替换文本即可获得英文版本。 这样一来,执行后就可以删除20个或更多用户。


到目前为止,这样对吗?"Löschen" = "删除" "Konto löschen" = "删除账户" "Nutzermenü öffnen" = ? - Aldasa
我的情况下,200毫秒太短了。将其设置为1000-1500毫秒就可以了! - Sebastian Ortmann
@Aldasa "Open user menu" 是指打开用户菜单。 - ErraticFox

5

2021年10月10日测试完成

setInterval(() => {
    document.getElementsByClassName('edit-account-button mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base')[0].click()
    var buttons = document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted');
    buttons.item(buttons.length - 1).click();
    document.getElementsByClassName('confirm-button mat-focus-indicator mat-raised-button mat-button-base mat-warn')[0].click()
}, 1000);

5

我在2020年11月16日成功使用了这段代码:

setInterval(function () {
    $('[aria-label="View more options"]')[0].click()
    document.querySelectorAll('.mat-menu-item')[2].click()
    document.querySelector('.confirm-button').click()
}, 1000);

如果您想为您的答案获得可能的声望,请提供更充实的信息以提高您的答案质量。在您之前已经有15个答案了... - ZF007

4

已更新至2022年3月,可使用“加载下一页记录”功能

setInterval(() => {
        var RecordsCount = document.getElementsByClassName('edit-account-button mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base').length;
        if (RecordsCount>0)
        {
            document.getElementsByClassName('edit-account-button mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base')[0].click()
            let deleteButtonPosition = document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted').length - 1
            document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted')[deleteButtonPosition].click()
            document.getElementsByClassName('confirm-button mat-focus-indicator mat-raised-button mat-button-base mat-warn')[0].click()
        }
        else
        {
              //reload more records
              $('[aria-label="Reload"]').first().click();
        }
}, 800);

你帮我删除了5万个账户。谢谢!脚本唯一的问题是我不得不将最后2k个账户的延迟增加到1秒(1000毫秒)。 - spasbil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接