【问题标题】:How to delete a user and their Firestore document in a callable cloud function如何在可调用的云函数中删除用户及其 Firestore 文档
【发布时间】:2020-05-24 18:15:46
【问题描述】:

我正在 firebase 中创建云功能并需要一些帮助,我正在尝试从 firebase 中删除用户并在一个云功能中从 firestore 中删除他的文档。

我如何为 auth 和 firestore 进行批处理作业/事务,假设用户尝试删除他的帐户,但由于某种原因 user.delete() 函数不起作用(假设它在 firebase 方面关闭在那一刻)。用户会收到一条错误消息,我们无法删除他的帐户,但当他尝试再次登录时,他也会收到错误消息,因为他的文档不存在。

我查看了删除用户数据的 firebase 扩展程序,但它并没有删除用户帐户,而且似乎有同样的问题。

我是否需要在应用程序/云功能中处理这种边缘情况,这是 firebase 应该处理的事情还是我只是出错了?

这是我的代码,如果有帮助的话:

const functions = require("firebase-functions");
const admin = require("firebase-admin");

exports.deleteUser = functions.https.onCall(async (data, context) => {
  try {
    const uid = context.auth.uid;
    const db = admin.firestore();
    const collection = db.collection("users");
    await collection.doc(uid).delete();
    await admin.auth.deleteUser(uid); // what if this line fails?
    return "success";
  } catch (err) {
    console.error(err);
    return "error";
  }
});

【问题讨论】:

    标签: node.js firebase google-cloud-firestore firebase-authentication firebase-admin


    【解决方案1】:

    这条线没有做你认为它正在做的事情:

    const user = await admin.auth().currentUser;
    

    user 将变为undefined,因为admin.auth() 没有名为currentUser 的属性(它是Auth 对象)。后端 SDK 中不存在“当前用户”的概念。这只是一个前端概念。但是,您所拥有的是一个字符串 uid,它是调用该函数的经过身份验证的用户的 UID。

    如果您想使用 Firebase Admin SDK 删除由uid 字符串标识的用户,则只需调用deleteUser(uid)

    await admin.auth().deleteUser(uid);
    

    顺便说一句,Delete User Data extension 不必删除用户,因为它通过响应用户使用客户端 SDK 删除自己的帐户来工作。这实际上应该足以完成这项工作。

    【讨论】:

    • 哎呀,感谢修复并解释了 firebase 扩展的工作原理。在我的情况下,如果用户是组管理员,我不想让用户删除他的帐户,因此我需要在函数中而不是在应用程序中删除他的帐户。
    • 好吧,如果经过身份验证的用户没有为自己调用该函数,那么context.auth.uid 对您删除帐户没有用处。它必须通过一个参数进入,然后您可以使用该参数调用admin.auth().deleteUser()。您可能想再试一次整个问题,并务必仔细考虑谁在调用该函数,以及您将如何确定要删除的用户。
    • 哇,非常感谢您提出的这些观点,我正在学习中...我知道无法按照我在问题中提出的要求进行操作。
    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 2021-02-09
    • 2019-01-23
    • 2021-02-13
    • 2022-01-21
    • 2021-07-15
    • 2018-03-28
    相关资源
    最近更新 更多