如何在可调用的云功能中删除用户及其Firestore文档

时间:2020-02-09 03:44:34

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

我正在Firebase中创建一个云功能,需要一些帮助,我正在尝试删除用户表单Firebase,并在一个云功能中从Firestore中删除其文档。

我如何才能为auth和firestore进行批处理作业/事务,可以说用户尝试删除其帐户,但是由于某种原因user.delete()函数不起作用(可以说它在Firebase端处于关闭状态)在那一刻)。用户将收到一条错误消息,提示我们无法删除他的帐户,但是当他尝试再次登录时,他也会收到一条错误消息,因为他的文档不存在。

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

我是否需要在app / cloud-functions中处理这种极端情况,是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";
  }
});

1 个答案:

答案 0 :(得分: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删除自己的帐户而起作用。实际上,这足以完成这项工作。