由于我可能滥用匿名身份验证(请参阅How to prevent Firebase anonymous user token from expiring)我的应用中有很多匿名用户,我实际上并不想要。
我无法批量删除这些用户。我是否必须逐个手动完成?无论如何使用API来访问用户帐户并为当前用户以外的用户操作它们吗?
答案 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);