如何在可调用云函数中删除用户及其 Firestore 文档

Zvi*_*arp 6 node.js firebase firebase-authentication firebase-admin google-cloud-firestore

我正在 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";
  }
});
Run Code Online (Sandbox Code Playgroud)

Dou*_*son 6

该行没有按照您的想法进行操作:

const user = await admin.auth().currentUser;
Run Code Online (Sandbox Code Playgroud)

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

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

await admin.auth().deleteUser(uid);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,“删除用户数据”扩展程序不必删除用户,因为它的工作原理是使用客户端 SDK 响应用户删除自己的帐户。这实际上应该足以使这项工作成功。