从 Firebase 中删除特定用户

Posted

技术标签:

【中文标题】从 Firebase 中删除特定用户【英文标题】:Delete a specific user from Firebase 【发布时间】:2016-12-12 12:41:59 【问题描述】:

有没有办法可以从 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 Documentation 表示如果用户当前已登录,则可以删除:

firebase.auth().currentUser.delete()

我的目标是允许登录的管理员用户从系统中删除其他用户。

【问题讨论】:

您能否详细说明您的代码“不起作用”的原因?你期待什么,实际发生了什么?如果您遇到异常/错误,请发布它发生的行和异常/错误详细信息。请edit这些详细信息,否则我们可能无法提供帮助。 我重新表述了这个问题。 【参考方案1】:

在使用客户端 SDK 进行 Firebase 身份验证时,您只能删除当前登录的用户帐户。其他任何事情都会带来巨大的安全风险,因为它会允许您应用的用户删除彼此的帐户。

用于 Firebase 身份验证的 Admin SDKs 旨在用于受信任的环境,例如您的开发机器、您控制的服务器或 Cloud Functions。因为它们运行在受信任的环境中,所以它们可以执行客户端 SDK 无法执行的某些操作,例如 deleting user accounts by simply knowing their UID。

另见:

delete firebase authenticated user from web application

另一种常见的方法是在例如 Firebase 数据库中保留白名单/黑名单,并据此授权用户。见How to disable Signup in Firebase 3.x

【讨论】:

我认为 FIrebase Admin SDK 只适用于服务器端而不是客户端,所以不能在 ReactJS 上使用它 这是正确的,也是有意的。想象一下,客户端代码可以删除它希望删除的任何用户,而无需先进行身份验证。这将是一个非常糟糕的安全风险。 查看最后一个答案【参考方案2】:

只需以与您完成身份验证相同的方式应用此代码。

var user = firebase.auth().currentUser;

user.delete().then(function() 
  // User deleted.
).catch(function(error) 
  // An error happened.
);

【讨论】:

应该是***评论 OP 要求的是特定用户,而不是当前登录的用户。 答错了,你会删除自己的用户【参考方案3】:

npm i --save firebase-admin

以管理员身份从“firebase-admin”导入 *

【讨论】:

不需要相关的评论和解释。【参考方案4】:

我知道这是一个老问题,但我找到了另一个解决方案。 正如我认为 Ali Haider 所建议的那样,您绝对不想在应用程序本身中使用 firebase-admin,因为它需要一个您不想与代码一起部署的私钥。

但是,您可以在 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 身份验证中删除该用户。

有关 Firebase 云函数的更多信息,请参阅https://firebase.google.com/docs/functions/get-started

【讨论】:

看起来是最好的解决方案!谢谢! 请注意:Cloud Functions 要求您启用 Blaze 计划(现收现付)【参考方案5】:

在我看来,您可以在没有 Firebase Admin SDK 的情况下删除特定用户。您必须存储您要管理的帐户的用户名、密码。并使用帐户登录 - 您声明一个管理员帐户。之后只需按照以下步骤操作:使用firebase auth注销->使用firebase auth登录您要删除的帐户->使用firebase auth删除该帐户->使用firebase auth注销->使用该“管理员帐户”再次登录.希望此解决方案可以帮助您在不使用 Firebase Admin SDK 的情况下删除帐户

【讨论】:

【参考方案6】:

使用 javascript API(不是管理 SDK)

就像this answer 指出用户登录一样,必须创建第二个应用才能删除登录用户以外的其他用户。

我就是这样做的:

  async deleteUser (user) 
    // Need to create a second app to delete another user in Firebase auth list than the logged in one.
    // https://***.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.
      )
  

【讨论】:

如果您将我的密码存储为纯文本,我不想出现在您的应用程序中。我认为这是一个糟糕的建议。 @MichajaBroertjes 谁说我就是这么做的?这段代码中没有任何内容说明这一点。而secondaryApp.auth().signInWithEmailAndPassword(user.email, user.password)函数是Firebase内置的,它接受用户输入的密码。 user 参数是包含用户刚刚输入的电子邮件和密码的对象。该应用程序是使用 Vue 构建的。

以上是关于从 Firebase 中删除特定用户的主要内容,如果未能解决你的问题,请参考以下文章

使用 android studio java Recycler 视图从 Firebase 实时数据库中删除一个节点

如何根据特定时间删除 Firebase 数据库中的项目

Vue.js 和 Firebase:删除了一个测试用户,现在所有路由都无法访问并且组件不呈现

在android中获取firebase用户ID

如何使用 Swift 从 UITableViewCell 中删除 Firebase 中的特定子节点

如何从 ListView 中删除 Firebase Android 中的特定节点