有没有办法可以从 firebase 获取特定用户帐户然后将其删除?
例如:
// I need a means of getting a specific auth user.
var user = firebase.auth().getUser(uid);
// Note the getUser function is not an actual function.
之后,我想删除该用户及其附加数据:
// This works
user.delete().then(function() {
// User deleted.
var ref = firebase.database().ref(
"users/".concat(user.uid, "/")
);
ref.remove();
});
Firebase 文档指出,如果用户当前已登录,则可以将其删除:
firebase.auth().currentUser.delete()
我的目标是允许登录的管理员用户从系统中删除其他用户。
使用客户端 SDK 进行 Firebase 身份验证时,您只能删除当前登录的用户帐户。其他任何操作都会带来巨大的安全风险,因为它会允许您应用的用户删除彼此的帐户。
用于 Firebase 身份验证的 Admin SDKs 旨在在受信任的环境中使用,例如您的开发计算机、您控制的服务器或 Cloud Functions。由于它们在受信任的环境中运行,因此可以执行客户端 SDK 无法执行的某些操作,例如只需知道用户帐户的 UID 即可删除用户帐户。
另请参阅:
另一种常见方法是在 Firebase 数据库中保留允许列表/阻止列表,并据此对用户进行授权。请参阅如何在 Firebase 3.x 中禁用注册
您绝对不想在应用程序本身中使用 firebase-admin,正如我认为 Ali Haider 所建议的那样,因为它需要一个您不想与代码一起部署的私钥。
但是,您可以在 Firebase 中创建一个云函数,该函数会在删除 Firestore 或实时数据库中的用户时触发,并让该云函数使用 firebase-admin 删除该用户。 就我而言,我的 Firestore 中有一组用户,其用户 ID 与 Firebase Auth 创建的用户 ID 相同,我在其中保存了额外的用户数据,例如名称和角色等。
如果您像我一样使用 Firestore,则可以执行以下操作。如果您使用的是实时数据库,只需在文档中查找如何使用触发器即可。
确保您的 Firebase 项目已初始化云函数。您的项目目录中应该有一个名为“functions”的文件夹。如果没有:使用以下命令初始化项目的 Cloud Functions:
firebase init functions
.
在以下页面的 Firebase 控制台中获取服务帐户的私钥:设置 > 服务帐户。
将包含私钥的 json 文件放在 index.ts 文件旁边的
functions\src
文件夹中。
在index.ts中导出以下函数:
export const removeUser = functions.firestore.document("/users/{uid}")
.onDelete((snapshot, context) => {
const serviceAccount = require('path/to/serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://<DATABASE_NAME>>.firebaseio.com"
});
return admin.auth().deleteUser(context.params.uid);
});
firebase deploy --only functions
当用户在 Firebase Firestore 中被删除时,此代码将运行并从 Firebase Auth 中删除该用户。
有关 Firebase Cloud Functions 的更多信息,请参阅 https://firebase.google.com/docs/functions/get-started
只需以与完成身份验证相同的方式应用此代码即可。
var user = firebase.auth().currentUser;
user.delete().then(function() {
// User deleted.
}).catch(function(error) {
// An error happened.
});
就像这个答案指出的用户登录一样,必须创建第二个应用程序才能删除登录用户之外的其他用户。
我就是这样做的:
async deleteUser (user) {
// Need to create a second app to delete another user in Firebase auth list than the logged in one.
// https://stackoverflow.com/a/38013551/2012407
const secondaryApp = firebase.initializeApp(config, 'Secondary')
if (!user.email || !user.password) {
return console.warn('Missing email or password to delete the user.')
}
await secondaryApp.auth().signInWithEmailAndPassword(user.email, user.password)
.then(() => {
const userInFirebaseAuth = secondaryApp.auth().currentUser
userInFirebaseAuth.delete() // Delete the user in Firebase auth list (has to be logged in).
secondaryApp.auth().signOut()
secondaryApp.delete()
// Then you can delete the user from the users collection if you have one.
})
}
添加 Michaja Broertjes 的答案,效果非常好! v1 我尝试让它在 v2 Firebase Function 中工作,这就是我的做法。
在index.js中(顶部)
const admin = require("firebase-admin");
const {
initializeApp,
applicationDefault,
getApps,
} = require("firebase-admin/app");
//
const serviceAccount = require("./serviceAccountKey.json");
const readyToUser = admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://helloooooo.firebaseio.com",
});
接下来是功能
exports.deleteuser = onDocumentDeleted("user/{uid}", (event) => {
const snap = event.data;
const data = snap.data();
return readyToUser.auth().deleteUser(event.params.uid);
});
希望这有帮助!
如果您想删除当前用户,这是 Firebase 9+ 的简单解决方案:
import { getAuth, deleteUser } from "firebase/auth";
const auth = getAuth();
const user = auth.currentUser;
deleteUser(user).then(() => {
// User deleted.
}).catch((error) => {
// An error ocurred
// ...
});
我认为,您可以在没有 Firebase Admin SDK 的情况下删除特定用户。您必须存储要管理的帐户的用户名、密码。并使用帐户登录 - 您声明一个管理员帐户。之后,只需按照步骤操作:使用 firebase auth 注销 -> 使用 firebase auth 使用要删除的帐户登录 -> 使用 firebase auth 删除该帐户 -> 使用 firebase auth 注销 -> 使用该“管理员帐户”再次登录。希望这个解决方案可以帮助您在不使用 Firebase Admin SDK 的情况下删除帐户