86

Is there an easy way to delete all registered users from firebase console? For example, I created a hundred users from my development environment, and now I want to delete all of them.

0

37 Answers 37

114

As in updated answer, you can probably use firebase admin tools now, but if you don't want – here is a bit more solid javascript to remove users in the 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)

Just run it in developer tools

2
  • 4
    This works, however make sure to have the tab open not switch to a different one while it's running
    – KrauseFx
    Apr 8, 2017 at 23:36
  • How do you run this in developer tools? I pasted it into the console. Something else to do then?
    – Praxiteles
    Jan 11, 2023 at 20:29
82

For the new Firebase update

Try this code for the latest Firebase update. Open the console, paste this code and hit enter.

setInterval(() => {
    document.getElementsByClassName('edit-account-button mat-mdc-menu-trigger mat-mdc-icon-button mat-mdc-button-base')[0].click()
    Array.from(document.getElementsByClassName('mat-mdc-focus-indicator mat-mdc-menu-item ng-star-inserted')).at(-1).click();
    document.getElementsByClassName('confirm-button  mat-mdc-raised-button mat-mdc-button-base mat-warn')[0].click()
}, 1000)
14
  • 9
    This works great, thanks! Just note: if there's an anonymous account in the list, change index in second 'getElementsByClassName' from 2 to 1. Also you can set shorter interval, i used 500. Apr 13, 2021 at 12:12
  • 3
    You are the best :). This works in 21.04.2021
    – Reinis
    Apr 20, 2021 at 21:01
  • 1
    I made it working by changing 2nd command's index to 1, not 2 => document.getElementsByClassName('mat-focus-indicator mat-menu-item ng-star-inserted')[1].click() May 27, 2021 at 15:20
  • 2
    @GregSadetsky 2022* 🤩 Jan 10, 2022 at 11:24
  • 2
    That's some beautiful hackery. Still working 21 feb 2022.
    – Aezur
    Feb 21, 2022 at 19:10
45

Because I'm pretty lazy at clicking buttons and elements in the UI, I set up a small client script:

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

You may need to run it multiple times, but it is much better than wasting the time clicking things on the screen manually.

11
  • Thanks a lot...works great..saves me 2 clicks and moving the mouse around :)
    – krv
    Oct 27, 2016 at 4:37
  • 1
    Thanks, this is really helpful :) Feb 1, 2017 at 17:43
  • @LuisMejíaF. I expected it to be useful when posting the answer :) Always, automate the stuff when there's something repetitive to do :-) Feb 1, 2017 at 17:55
  • yo, very useful bro) Feb 18, 2017 at 11:40
  • 3
    @mjpablo23 Open the browser developer tools (Right click on the page and Inspect or Inspect Element), then go to the Console tab and paste the code and press the return / enter key. Apr 1, 2017 at 19:30
32

Fully working solution using Firebase Admin SDK

Using the Firebase Admin SDK is really easy and the recommended way to perform such tasks on your Firebase data. This solution is unlike the other makeshift solutions using the developer console.

I just put together a Node.js script to delete all users in your Firebase authentication. I have already tested it by deleting ~10000 users. I simply ran the following Node.js code.

To setup Firebase Admin SDK

Create a new folder. Run the following in terminal

npm init
sudo npm install firebase-admin --save

Now create an index.js file in this folder.

Steps to follow:

  • Go to your Firebase project -> Project Settings -> Service Accounts.
  • Click on Generate new Private Key to download the JSON file. Copy the path to JSON file and replace it in the code below in the path to service accounts private key json file.
  • Also, copy the databaseURL from the settings page. Replace it in the code.
  • Copy and paste the code in index.js.
  • Run in terminal node index.js. Watch the mayhem!
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();
7
  • 1
    This worked for me. I'm blocked right now tho, api didn't let me delete more about 8,000 users in
    – Jorsh
    Aug 27, 2019 at 0:20
  • Glad it worked. However, I did not face any blocking or restrictions when I tried it. Aug 27, 2019 at 5:59
  • just dont let the general public have access to this May 13, 2020 at 14:00
  • Nice. Here it complained about reaching the limit after ~100 removals, but just executed it again to finishing removing all. I recommend using .gitignore on the cred.json file. Feb 4, 2021 at 23:21
  • @Jorsh if you want ot avoid restrictions in my case simple timeout helped when calling getAllUsers again: setTimeout(() => { getAllUsers(listUsersResult.pageToken) }, 6000);
    – Karol Be
    Mar 24, 2022 at 8:54
27
setInterval(() => {
  $('[aria-label="Delete account"]').first().click()
  setTimeout(()=>{
    $(".md-raised:contains(Delete)").click()
  }, 100)
}, 2000);

designed to avoid calling delete endpoint very often, since google fails with 404 error.

8
  • haha, thanks @AndroidRuntimeException , now someone should release an international version (seeing all those different languages above) and a version with official API, and this post will become ideal, lol Aug 18, 2018 at 5:00
  • 3
    @gbhall ahahaha, glad you had fun with it. Jun 27, 2019 at 5:44
  • 1
    I had slow internet sow I had to put interval of 5000
    – Murtuza
    Sep 28, 2019 at 15:09
  • 1
    I love this solution! I'm adding an if statement to count for the need to go to the next page though.
    – Chris
    Feb 16, 2020 at 18:18
  • 1
    @www.eugenehp.tk posted :)
    – Chris
    Mar 2, 2020 at 13:24
20

firebaser here

Update 2016-11-08 original answer below

We just released the Firebase Admin SDK, which supports administrative use-cases, such as deleting a user account without requiring that user to sign in first.

original answer

There is currently no API in Firebase Authentication to delete a user without requiring that user to sign in. We know this limits the usability of our API and are working to add such functionality in a future release. But as usual, we don't provide specific timelines for when the feature will be available.

For the moment your only work arounds are to:

  • sign in as each test user in the app and delete the user from there
  • delete each user in turn from the Firebase Console
5
  • 24
    Can you please consider removing the 'Are you sure prompt' in the Firebase Console if you 'Shift' + click 'Delete account'. This would mimic the behaviour in the database and would significantly speed things up.
    – DrZaphod
    Oct 13, 2016 at 10:02
  • Can I "sign in as each test user" from appengine , without browser? Can I delete users from app engine directly somehow or via some web services?
    – makkasi
    Nov 1, 2016 at 13:35
  • in the NodeJs firebase-admin SDK is there no way to get all users then for each user admin.auth().deleteUser(uid);
    – Snewedon
    Nov 8, 2016 at 3:53
  • @Frank van Puffelen I see there is not python admin SDK. Is there some way to use the nodeJS admin SDK inside python.
    – makkasi
    Feb 24, 2017 at 8:23
  • Am glad to know this is now possible via firebase admin sdk. Would be cool to know if these can also be uploaded and used as google https functions? TIA!
    – raiser00
    Dec 27, 2017 at 15:43
7

Slightly increased your helper script.

German firebase site version:

$('[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);
}

For the english version just replace the text. This way you can delete 20 or more users once executed.

3
  • Is this right so far? "Löschen" = "Delete" "Konto löschen" = "Delete account" "Nutzermenü öffnen" = ?
    – Aldasa
    Jan 14, 2017 at 12:38
  • 200 ms was short in my case. Set to 1000 - 1500 ms and it works! Jul 20, 2018 at 0:39
  • @Aldasa "Open user menu" is Nutzermenü öffnen
    – ErraticFox
    Jun 14, 2020 at 0:25
5

Used this code successfully on 11/16/2020:

setInterval(function () {
    $('[aria-label="View more options"]')[0].click()
    document.querySelectorAll('.mat-menu-item')[2].click()
    document.querySelector('.confirm-button').click()
}, 1000);
1
  • If you want to get possible rep for your answer then provide substantial more info to boos quality of your answer. 15 answer were before you...
    – ZF007
    Nov 16, 2020 at 21:43
5

Tested at 10 Oct 2021

This will click on the last button in the context menu which is always the Delete button, so it works on all account types
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

This code still works as by June 20, 2023.

Following are the steps to delete all users in one go.

  1. Open Firebase Authentication
  2. Right Click and choose Inspect
  3. In the developer tools, tap the Console tab
  4. Paste this code there
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)
  1. Hit Enter

If above query is not working, try this one:

setInterval(() => {
    // click on 3 dots next to user
    document.getElementsByClassName('mat-mdc-menu-trigger mat-mdc-tooltip-trigger edit-account-button mdc-icon-button mat-mdc-icon-button mat-unthemed mat-mdc-button-base')[0].click();
    // click on delete account
    document.getElementsByClassName('mat-mdc-menu-item mat-mdc-focus-indicator ng-star-inserted')[2].click();
    // click on delete in confirmation dialog
    document.getElementsByClassName('confirm-button mdc-button mdc-button--raised mat-mdc-raised-button mat-warn mat-mdc-button-base')[0].click();
// changed timer to 2000 as it was not deleting after 500ms
}, 2000);

This will start deleting your users.

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

Try this one. It's an update to @www.eugenehp.tk answer above that takes into account the need to refresh the page if you have more than one page of entries.

1
  • Brilliant solution, works like a charm! Thank you! 🙌🏽
    – Narcis
    Aug 7, 2020 at 15:09
4

Updated 03/2022 working (with load next records page)

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);
1
  • You helped me delete 50k accounts. Thank you! The only problem with the script was that I had to increase the delay for the last 2k accounts to 1 second (1000 ms).
    – spasbil
    May 5, 2022 at 13:06
3

Well, I used this script to delete all users at once in Firebase console:

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

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

2
  • How to delete only single user by uid?
    – Ashish P
    Jun 28, 2017 at 5:28
  • Received an error: VM225:1 Uncaught TypeError: Cannot read properties of null (reading 'each') at <anonymous>:1:35 - Suggestions?
    – Praxiteles
    Jan 11, 2023 at 20:20
2

Just created a script to run into console when the Firebase Authentication window is opened. Step 1: Go to the Authentication Tab of your Firebase Project

Step 2: Press Ctrl + Shift + i to go to browser console

Step 3: Copy the following code and paste it into the console.



(function delScript() {
  const allRowNodes = document.querySelectorAll("tbody tr");
  if (!allRowNodes || !allRowNodes.length) {
    console.log("No Accounts to delete 🙄😐");
    return null;
  }
  allRowNodes.forEach((curRowNode, idx) => {
    setTimeout(() => {
      curRowNode.querySelector(".edit-account-button").click();
      setTimeout(() => {
        document.querySelector("button.mat-menu-item:nth-child(3)").click();
        setTimeout(() => {
          document
            .querySelector("fire-dialog-actions button:nth-child(2)")
            .click();
          setTimeout(() => {
            const backdrop = document.querySelector(
              ".cdk-overlay-backdrop-showing"
            );
            backdrop.click();
          }, 1200);
        }, idx * 1600);
      }, idx * 800);
    }, idx * 800);
  });
})();


2

Thanks @Fernando for your answer. Needed to change button number from 1 to 2, increased the time from 500 to 2000 and it worked like a charm.

setInterval(() => {
    // click on 3 dots next to user
    document.getElementsByClassName('mat-mdc-menu-trigger mat-mdc-tooltip-trigger edit-account-button mdc-icon-button mat-mdc-icon-button mat-unthemed mat-mdc-button-base')[0].click();
    // click on delete account
    document.getElementsByClassName('mat-mdc-menu-item mat-mdc-focus-indicator ng-star-inserted')[2].click();
    // click on delete in confirmation dialog
    document.getElementsByClassName('confirm-button mdc-button mdc-button--raised mat-mdc-raised-button mat-warn mat-mdc-button-base')[0].click();
// changed timer to 2000 as it was not deleting after 500ms
}, 2000);
1

Russian version

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)

1
1

A solution that worked for me was to create a separate file and import my firebase-admin and simply run the following:

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

The concept here is that we want to retrieve all the users from our user auth table, then cycle throw and delete them one at a time using the deleteUser admin auth method.

In the terminal, I simply used node to call the function in the file (so let's say the filename is delete_users.js, I just called node delete_users.js and the listUsers function was invoked.

Hope this helps.

1
1

French version,

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: if you are not web developer and "Execute in tools developer" means nothing to you, here the procedure.

  • Open your firebase authentication/users page with Chrome
  • Press control + shif+ J
  • In the console tab, paste this code and press enter.

  • If the language matched with the code your paste, account will start to be deleted.

1

if u have anonymous accounts

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)
1

Just execute the below script on the console and it will delete all users at once.

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

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

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

1
  • 1
    THANK YOU, out of all the answers, this one worked perfectly, appreciate it!!!! <3 Oct 5, 2021 at 3:57
1

Updated 2021 working answer

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

1

This Works now 17.09.2021

Go to your firebase console, click inspect element and select console and paste this code there.

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)

For authentication types: if you authenticate by mail id use [2] in the second line, if you use mobile authentication use1 in the second line

enter image description here

1

I will just add that if you have many users you need to press the reload button so just make another setInterval:

const reloadButton = document.querySelectorAll("button")[10];
const arr = document.getElementsByClassName('edit-account-button mat-focus-indicator mat-menu-trigger mat-icon-button mat-button-base');

and the setInterval:

setInterval(() => {
if(!arr.length) reloadButton.click()
}, 1000)
1
    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)

This code works if the user's options also include MFA

Test Date: 15/10/2023

Simple open developers option -> console -> paste and hit enter

0

This might be helpful to some. If you have access to the firebase user console - just save the page as an html and use the following to delete users with node. need to setup 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);
});

I would recommend doing a dry run of the html parsing logic once on the page using browser by just running this and confirming that only user ids are displayed in the result. In my case this returned all UIDs

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

I used it

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")

0

I tried all the previous, none worked, so I created one for my needs:

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

Here's another script that can be used as a bookmarklet. Simply

  1. create a new bookmark (Ctrl-D)
  2. select "more"'
  3. paste the script into the URL input

You can then just click the bookmark to delete all users. The script will stop when there's no more users or you navigate away. If you're not using the english version, update the *Text variables with the corresponding 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();
})();
0

In my project, I had firebaseAdmin hooked up to an emulator for testing. To clear the database before each test I combined the listUsers function with the deleteUser function. Caution you probably don't want to create this type of functionality for a real database.

My code looked like this.

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),
      ),
    );
}

But you could also use async await and accomplish the same thing with

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),
  );
}

Also if you do happen to use an emulator for testing, the UI for it comes shipped with a delete all button. see (here)[https://imgur.com/3Xil86I]

0

Simple delete all users - 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();

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.