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

Posted

技术标签:

【中文标题】从 Firebase 身份验证控制台中删除所有用户【英文标题】:Delete all users from firebase auth console 【发布时间】:2016-12-13 00:27:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

firebaser 在这里

2016 年 11 月 8 日更新 下面的原始答案

我们刚刚发布了Firebase Admin SDK,它支持管理用例,例如deleting a user account without requiring that user to sign in first。

原始答案

Firebase 身份验证中目前没有 API 可以在不要求用户登录的情况下删除用户。我们知道这会限制我们 API 的可用性,并正在努力在未来的版本中添加此类功能。但与往常一样,我们没有提供该功能何时可用的具体时间表。

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

在应用中以每个测试用户的身份登录并从那里删除该用户 从 Firebase 控制台依次删除每个用户

【讨论】:

如果您“Shift”+点击“删除帐户”,您能否考虑删除 Firebase 控制台中的“您确定提示”。这将模仿数据库中的行为并显着加快速度。 我可以在没有浏览器的情况下从 appengine “以每个测试用户身份登录”吗?我可以通过某种方式或通过某些网络服务直接从应用引擎中删除用户吗? 在 NodeJs firebase-admin SDK 中没有办法为每个用户获取所有用户admin.auth().deleteUser(uid); @Frank van Puffelen 我看到没有 python 管理 SDK。有没有办法在 python 中使用 nodeJS admin SDK。 很高兴知道现在可以通过 firebase admin sdk 实现这一点。知道这些是否也可以上传并用作谷歌 https 功能会很酷吗? TIA!【参考方案2】:

因为我很懒惰点击 UI 中的按钮和元素,所以我设置了一个小的客户端脚本:

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

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

【讨论】:

非常感谢...效果很好..为我节省了 2 次点击和移动鼠标 :) 谢谢,这真的很有帮助:) @LuisMejíaF。我希望在发布答案时它会很有用:) 总是,当有重复的事情要做时自动执行 :-) 哟,非常有用的兄弟) @mjpablo23 打开浏览器开发者工具(右击页面和InspectInspect Element),然后转到Console标签并粘贴代码并按return / 回车键。【参考方案3】:

略微增加了您的帮助脚本。

德国 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" = ? 200 毫秒对我来说很短。设置为 1000 - 1500 ms 就可以了! @Aldasa "打开用户菜单" 是 Nutzermenü öffnen【参考方案4】:

好吧,我用这个脚本在 Firebase 控制台中一次删除所有用户:

$('[aria-label="Delete account"]').each(function() 
  $(this).click();
  $('[ng-click="controller.submit()"]').click()
)

https://console.firebase.google.com/project/YOUR_PROJECT_NAME/authentication/users

【讨论】:

如何通过uid只删除单个用户?【参考方案5】:

这可能对某些人有所帮助。 如果您有权访问 firebase 用户控制台 - 只需将页面保存为 html 并使用以下命令删除带有 node.js 的用户。需要设置 firebase-admin

let fs = require('fs'),
  admin = require('firebase-admin'),
  cheerio = require('cheerio');

// initialize firebase admin here
admin.initializeApp(
credential: admin.credential.cert('path/to/serviceAccountKey.json'),
databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
);

// use cheerio to load the html file you downloaded
$ = cheerio.load(fs.readFileSync('./yourfirebaseconsole.html'));
$('.a12n-user-uid .fb-table-cell-wrapper').each(function() 
  admin.auth().deleteUser($(this).text());
).then(() => 
  console.log('successfully delete user');
).catch((error) => 
  console.log('error occurred ', error);
);

我建议使用浏览器在页面上运行一次 html 解析逻辑,只需运行它并确认结果中只显示用户 ID。就我而言,这返回了所有 UID

$('.a12n-user-uid .fb-table-cell-wrapper').each(function() 
  console.log($(this).text());
);

【讨论】:

【参考方案6】:

在更新的答案中,您现在可能可以使用 firebase 管理工具,但如果您不想要 - 这里有一些更可靠的 javascript 来删除网络中的用户:

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)

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

【讨论】:

这行得通,但请确保在标签页打开时不要切换到其他标签页 也为我工作。谢谢。很遗憾,这必须是解决方法。 这个答案你应该获得诺贝尔奖! ? 我什至不知道我可以在控制台中运行 Javascript。得到教训。也学习其他事物的基础知识。 这个脚本比其他脚本好!【参考方案7】:

俄文版

var intervalId;

var clearFunction = function() 
if ($('[aria-label="Удаление аккаунта"]').size() == 0) 
console.log("interval cleared")
clearInterval(intervalId)
return

$('[aria-label="Удаление аккаунта"]')[0].click();
setTimeout(function () 
$('[ng-click="controller.submit()"]').click()
, 1000);
;

intervalId = setInterval(clearFunction, 3000)

【讨论】:

请提供一些解释【参考方案8】:

这是我的自行车:?

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

旨在避免经常调用 delete 端点,因为 google 失败并出现 404 错误。

【讨论】:

哈哈,谢谢@androidRuntimeException,现在应该有人发布一个国际版(见上面所有不同的语言)和一个带有官方API的版本,这个帖子会很理想,lol @gbhall ahahaha,很高兴你玩得开心。 我的网速很慢,我不得不设置 5000 的间隔 我喜欢这个解决方案!我正在添加一个 if 语句来计算是否需要转到下一页。 @www.eugenehp.tk 已发布 :)【参考方案9】:

我用过

var openMenuItemForFirstUser = function () 
    const menuItem = $('[ng-click="controller.deleteUser()"]')
    if (menuItem.size()) 
        menuItem[0].classList.add("deletingThisUser")
        menuItem[0].click();
        setTimeout(deleteUser, 10, 0)
     else 
        console.log("No users found...")
    
;

var deleteUser = function (t) 
    const confirmButton = $('[ng-click="controller.submit()"]')
    if (confirmButton.size()) 
        console.log("deleting user")
        confirmButton[0].click()
        setTimeout(waitForDeletion, 10, 0)
     else 
        if (t > 500) console.log("fail trying delete user")
        else setTimeout(deleteUser, 10, parseInt(t) + 1)
    


var waitForDeletion = function (t) 
    const deletingThisUser = $('.deletingThisUser')
    if (deletingThisUser.size()) 
        if (t > 500) console.log("fail wait for deletion")
        else setTimeout(waitForDeletion, 10, parseInt(t) + 1)
     else 
        setTimeout(openMenuItemForFirstUser, 10)
    


setTimeout(openMenuItemForFirstUser, 1000)
console.log("Deleting all users... Press F5 to cancel it")

【讨论】:

【参考方案10】:

使用 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 项目 -> 项目设置 -> 服务帐户。 点击Generate new Private Key 下载 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();

【讨论】:

这对我有用。我现在被屏蔽了,api 没有让我删除更多的大约 8,000 个用户 很高兴它成功了。但是,我在尝试时没有遇到任何阻塞或限制。 只是不要让公众接触到这个 不错。在这里,它抱怨在大约 100 次删除后达到了限制,但只是再次执行它以完成全部删除。我建议在 cred.json 文件上使用 .gitignore。【参考方案11】:

一个对我有用的解决方案是创建一个单独的文件并导入我的 firebase-admin 并简单地运行以下命令:

const admin = require('./firebase_admin');

const listAllUsers = () => 
  console.log('list all users');
  // List batch of users, 1000 at a time.
  admin.auth().listUsers(1000)
    .then((listUsersResult) => 
      listUsersResult.users.forEach((userRecord) => 
        const user = userRecord.toJSON();
        admin
          .auth()
          .deleteUser(user.uid)
          .then(() => 
            console.log('successfully deleted user');
          )
          .catch((err) => 
            console.error('error deleting user: ', err);
          );
      );
      if (listUsersResult.pageToken) 
        // List next batch of users.
        listAllUsers(listUsersResult.pageToken);
      
    )
    .catch((error) => 
      console.log('Error listing users:', error);
    );
;
// Start listing users from the beginning, 1000 at a time.
listAllUsers();

这里的概念是我们想从我们的用户身份验证表中检索所有用户,然后使用 deleteUser 管理员身份验证方法循环抛出并一次删除一个。

在终端中,我只是简单地使用node调用文件中的函数(假设文件名是delete_users.js,我只是调用了node delete_users.js并调用了listUsers函数。

希望这会有所帮助。

【讨论】:

谢谢,但我必须补充一些东西。需要添加 firebase-functions 和私钥来提供脚本凭据以运行。遵循以下步骤:firebase.google.com/docs/admin/setup【参考方案12】:
setInterval(() => 
  if ($('[aria-label="Delete account"]').length > 0) 
    $('[aria-label="Delete account"]').first().click()
    setTimeout(()=>
      $(".md-raised:contains(Delete)").click()
    , 100)
   else 
    $('[aria-label="Reload"]').first().click()
  
, 2000);

试试这个。这是对上述@www.eugenehp.tk 答案的更新,考虑到如果您有超过一页条目,则需要刷新页面。

【讨论】:

绝妙的解决方案,就像一个魅力!谢谢! ??【参考方案13】:

试试这个,在浏览器控制台中。我在 firebase 中找不到批量删除选项。所以我写了这个js。

 var elements = [];
  $('.a12n-users-table').find('tr').each(function(r)
   $(this).find('td.table-row-actions').each(function(tds) 
    $(this).find('button').each(function(x)
        if($(this).attr('aria-label')=="Delete account")
            elements.push($(this));
        
    );
   );
  );

   var index = 0;
     function deleteUser()
      index++;
      elements[index].click();
      $('.fb-dialog-actions').find('.md-warn').click();
      setTimeout(deleteUser, 5000); 
   
  deleteUser();

【讨论】:

【参考方案14】:

法文版,

var intervalId;

var clearFunction = function() 
  if ($('[aria-label="Supprimer le compte"]').size() == 0) 
    console.log("interval cleared")
    clearInterval(intervalId)
    return
  
  $('[aria-label="Supprimer le compte"]')[0].click();
  setTimeout(function () 
     $(".md-raised:contains(Supprimer)").click()
  , 1000);
;

intervalId = setInterval(clearFunction, 3000)

PS:如果您不是 Web 开发人员,并且“在工具开发人员中执行”对您来说毫无意义,这里是过程。

使用 Chrome 打开您的 Firebase 身份验证/用户页面 按住 control + Shift+ J

在控制台选项卡中,粘贴此代码并按 Enter。

如果语言与您粘贴的代码匹配,帐户将开始被删除。

【讨论】:

【参考方案15】:

对于新的 Firebase 更新

尝试使用此代码获取最新的 Firebase 更新。 打开控制台,粘贴这段代码并回车!!!

setInterval(() => 
    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()
, 1000)

【讨论】:

这很好用,谢谢!请注意:如果列表中有匿名帐户,请将第二个“getElementsByClassName”中的索引从 2 更改为 1。您也可以设置更短的间隔,我使用 500。 你是最棒的:)。这适用于 21.04.2021 我通过将第二个命令的索引更改为 1 而不是 2 => document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted')[1] 使它工作。点击() 这适用于我 17.09.2021。对于通过邮件 ID 进行身份验证的用户,只需在第二行使用 [2],而其他使用移动身份验证的用户在第二行使用 [1]。 @GregSadetsky 2022* ?【参考方案16】:

在 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 个答案摆在你面前……【参考方案17】:

我尝试了所有以前的方法,但都没有奏效,所以我根据需要创建了一个:

setInterval(() => 

  if ($('[aria-label="View more options"]').length > 0) 

    $('[aria-label="View more options"]')[0].click()

    if ($('[role="menuitem"]').length > 0) 

      $('[role="menuitem"]')[1].click()

      if ($('[class="confirm-button mat-focus-indicator mat-raised-button mat-button-base mat-warn"]').length > 0) 

        $('[class="confirm-button mat-focus-indicator mat-raised-button mat-button-base mat-warn"]').click()
      
    
  
, 500);

【讨论】:

【参考方案18】:

这是另一个可用作书签的脚本。简单的

    创建新书签 (Ctrl-D) 选择“更多”' 将脚本粘贴到 URL 输入中

然后您只需单击书签即可删除所有用户。当没有更多用户或您离开时,脚本将停止。如果您使用的不是英文版,请使用相应的文本更新 *Text 变量。

javascript: (function () 
  const deleteText = 'Delete account';
  const deleteConfirmationText = 'Delete';

  const editSelector = '.edit-account-button';
  const deleteSelector = `button:contains($deleteText)`;
  const deleteConfirmationSelector = `button span:contains($deleteConfirmationText)`;
  const waitForAnimation = 350;

  const deleteUsers = () => 
    const editAccountButton = $(editSelector).first();

    if (!editAccountButton.size()) 
      console.log('Delete complete.');
      return;
    

    editAccountButton.first().click();
    setTimeout(() => 
      $(deleteSelector).first().click();
      setTimeout(() => 
        $(deleteConfirmationSelector).first().click();
        setTimeout(() => 
          deleteUsers();
        , waitForAnimation * 1.5);
      , waitForAnimation);
    , waitForAnimation);
  ;

  deleteUsers();
)();

【讨论】:

【参考方案19】:

如果你有匿名账户

setInterval(() => 
    document.getElementsByClassName('edit-account-button mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base')[0].click()
    document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted')[document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted').length === 3 ? 2 : 1].click()
    document.getElementsByClassName('confirm-button mat-focus-indicator mat-raised-button mat-button-base mat-warn')[0].click()
, 1000)

【讨论】:

【参考方案20】:

只需在控制台上执行以下脚本,它会立即删除所有用户。

$('.edit-account-button').click();

$('.mat-menu-content button:last-child').click()

$('.fire-dialog-actions .confirm-button').click()

【讨论】:

谢谢你,在所有的答案中,这个完美的工作,感谢它!!!! 【参考方案21】:

刚在这里工作(2021 年)

var times = 0;


setInterval(() => 
   $('.edit-account-button').first().click()
  setTimeout(()=>
    $(".mat-button-wrapper:contains(Excluir)").click()
  , 200)

   setTimeout(()=>
    $(".mat-menu-item:contains(Excluir)").click()
  , 200) 
  setTimeout(()=>
    $(".mat-button-wrapper:contains(Excluir)").click()
  , 200)
  times++;
console.log(times)

  if(times == 150) 

  console.log("ATUALIZANDO!!!")
  setTimeout(()=>
    $('[aria-label="Atualizar"]').click();
    times = 0 ;
  , 200)

  
, 1000);

每150次重新加载,你只需要放入250

【讨论】:

【参考方案22】:

更新的 2021 年工作答案

const interval = setInterval(() => 
  if ($('.edit-account-button').length === 0) 
    clearInterval(interval)
   else 
    $('.edit-account-button').first().click()
    $('button:contains("Delete account")').click()
    $('.confirm-button').click()
  
, 1000)

https://gist.github.com/cupcakearmy/8c314b891e6958f26374c0205bac85e9

【讨论】:

【参考方案23】:

在我的项目中,我将 firebaseAdmin 连接到模拟器进行测试。为了在每次测试之前清除数据库,我将listUsers 函数与deleteUser 函数结合使用。 注意您可能不想为真实数据库创建这种类型的功能。

我的代码看起来像这样。

import * as Bluebird from "bluebird"

function clearAllUsers() 
  return Promise.resolve()
    .then(() => admin.auth().listUsers())
    .then((response) => response.users)
    .then((users) =>
      Bluebird.map(users, (user:  uid: string ) =>
        admin.auth().deleteUser(user.uid),
      ),
    );

但您也可以使用 async await 并完成同样的事情

import * as Bluebird from "bluebird"
async function clearAllUsers() 
  const usersResponse = await admin.auth().listUsers();
  const users = usersResponse.users;
  return await Bluebird.map(users, (user:  uid: string ) =>
    admin.auth().deleteUser(user.uid),
  );


此外,如果您碰巧使用模拟器进行测试,那么它的 UI 会附带一个全部删除按钮。见(这里)[https://imgur.com/3Xil86I]

【讨论】:

【参考方案24】:

简单删除所有用户 - ESM

// delete.ts or delete.mjs

import admin from 'firebase-admin';
import cred from './credentials.json';
let firebaseApp = admin.initializeApp(
    credential: admin.credential.cert(cred as admin.ServiceAccount)
);
const listAllUsers = (nextPageToken?: string) => 
    // List batch of users, 1000 at a time.
    admin
        .auth()
        .listUsers(1000, nextPageToken)
        .then(async (listUsersResult) => 
            await admin.auth().deleteUsers(listUsersResult.users.map((u) => u.uid));
            if (listUsersResult.pageToken) 
                // List next batch of users.
                listAllUsers(listUsersResult.pageToken);
            
        )
        .catch((error) => 
            console.log('Error listing users:', error);
        );
;
listAllUsers();

【讨论】:

【参考方案25】:

感谢 @abbas-ali 分享此脚本,它与最新的 firebase 版本完美配合(2021 年 7 月测试,有 600 多条记录 - 匿名和多联邦登录电子邮件地址)

setInterval(() => 
    document.getElementsByClassName('edit-account-button mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base')[0].click()
    if(document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted').length===3)
      document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted')[2].click()
    else
      document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted')[1].click()
       
    document.getElementsByClassName('confirm-button mat-focus-indicator mat-raised-button mat-button-base mat-warn')[0].click()
, 1000)

【讨论】:

【参考方案26】:

此作品现在 17.09.2021

转到您的 Firebase 控制台,单击检查元素并选择控制台并将此代码粘贴到那里。

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

对于身份验证类型: 如果您通过邮件 ID 进行身份验证,请在第二行使用 [2], 如果您使用移动身份验证,请在第二行使用1

【讨论】:

【参考方案27】:

于 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);

【讨论】:

以上是关于从 Firebase 身份验证控制台中删除所有用户的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 身份验证中删除用户

如何使用 javascript 从 Firebase 电话身份验证中删除验证码?

Firebase 身份验证获取已删除的用户

Firebase 身份验证:如何验证用户仍然存在

将电子邮件从身份验证列表发送给Firebase上的所有用户

Firebase Google 用户未在 Firebase 控制台身份验证中显示