如何从Firebase的实时数据库中删除具有UID的用户?

时间:2018-07-09 13:32:28

标签: javascript firebase firebase-realtime-database firebase-authentication

数据库结构如下

-LGw89Lx5CA9mOe1fSRQ {
    uid: "FzobH6xDhHhtjbfqxlHR5nTobL62"
    image: "https://pbs.twimg.com/profile_images/8950378298..."
    location: "Lorem ipsum, lorem ipsum"
    name: "Lorem ipsum"
    provider: "twitter.com"
}

如何以编程方式删除所有内容,包括-LGw89Lx5CA9mOe1fSRQ键?

我看过了,但是它已经过时了Firebase: removeUser() but need to remove data stored under that uid

我也查看了this,但这要求用户不断登录(我将用户ID保存在localStorage中),并且刷新后返回null我写firebase.auth().currentUser。数据记录和用户帐户是通过社交网络提供商创建的,我可以在Firebase控制台的 Authentication Database 标签上看到数据。

我已经尝试过这些代码,但是什么也没做。

 // currentUser has a value of UID from Firebase
 // The value is stored in localStorage
 databaseChild.child(currentUser).remove()
   .then(res => {
       // res returns 'undefined'
       console.log('Deleted', res);
   })
   .catch(err => console.error(err));

最重要的是,我需要一键式同时从 Authentication 标签和 Database 中删除用户(具有特定的UID)。

我知道有一个Firebase Admin SDK,但是我正在创建一个单页应用程序,并且我没有任何后端代码。一切都在前端完成。

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:2)

在@jeremyw和@ peter-haddad的建议下,我完全可以得到我想要的东西。这是Firebase Cloud Functions上托管的代码

const functions = require('firebase-functions'),
    admin = require('firebase-admin');

admin.initializeApp();

exports.deleteUser = functions.https.onRequest((request, response) => {
    const data = JSON.parse(request.body),
        user = data.uid;

    // Delete user record from Authentication
    admin.auth().deleteUser(user)
        .then(() => {
            console.log('User Authentication record deleted');
            return;
        })
        .catch(() => console.error('Error while trying to delete the user', err));

    // Delete user record from Real Time Database
    admin.database().ref().child('people').orderByChild('uid').equalTo(user).once('value', snap => {
        let userData = snap.val();
        for (let key of Object.keys(userData)) {
            admin.database().ref().child('people').child(key).remove();
        }
    });

    response.send(200);
});

此外,如果您遇到CORS错误,请将mode: 'no-cors'选项添加到fetch()函数中,它将正常工作。

答案 1 :(得分:1)

The link you already found(用于删除客户端的用户登录帐户)是您唯一的选择,如果您想对客户端进行操作。通常出于安全原因,您希望将大多数操作保留在服务器上,例如用于帐户创建/删除操作,而Firebase会强制执行此操作。仅当您最近登录时才能删除帐户,客户端无法删除旧的/随机的帐户。

更好的选择是创建自己的Cloud Function,以处理与删除用户有关的所有事情。您必须使用已经为此找到的the Admin SDK ...但是您可能希望Cloud Function执行所需的操作-它必须从Auth选项卡中删除用户,并删除匹配项数据库中的数据。