如何分别从 Firebase Auth 和实时数据库中原子地删除用户和用户的数据?

Posted

技术标签:

【中文标题】如何分别从 Firebase Auth 和实时数据库中原子地删除用户和用户的数据?【英文标题】:How to atomically delete user and user's data from Firebase Auth and Realtime Database respectively? 【发布时间】:2017-03-27 10:48:23 【问题描述】:

一些背景

创建用户帐户后,我使用回调链按顺序 1 > 2 > 3 做 3 件事。

    在 Firebase Auth 中创建用户(使用 createUser(withEmail ...) 的标准方式)

    我将用户的个人资料图片上传到 Firebase 存储并捕获返回的 downloadUrl 以用于第 3 步

    我将用户的其他信息(包括步骤 2 中的 downloadUrl)存储在实时数据库的一个节点中(由 $userid 键入)

现在的问题

我提供了一个名为“删除帐户”的按钮,可以让用户删除所有内容。也就是说,清除他们在实时数据库中的所有数据,清除他们在 Firebase 存储中的个人资料图片,最后从 Auth 中删除他们的帐户。 重要的是,所有这些操作都应该成功,或者即使有一个失败也应该取消。

我已经浏览了大约 10 页的 S/O 问题和答案,其中有 1 个 unanswered question 像这样(它询问了帐户创建过程......我想这个问题的答案很容易适应在这里。)

我尝试了什么?

目前,我像这样使用回调链:

// start by atomically deleting all the user data from the Realtime Database using the fanout system.
- get all appropriate locations and save in fanout dictionary
- update all these locations to nil // atomic goodness :)
    -callback:
        -on failure: 
            - just return // no worries, nothing has changed yet :/
        -on success:
            // proceed to delete user files on firebase storage
            - delete path $userid on firebase storage
                -callback:
                    -on failure: // this is bad, no idea what to do :(
                    -on success:
                        // proceed to delete account from Auth
                        - delete user account from Auth
                            -callback:
                                -on failure: // this is terrible, also, it could happen often b/c firebase does ask for re-authentication sometimes :(
                                -on success: // thank goodness! I have an authListener somewhere ready to show the 'signInViewController' :)

您如何以原子方式处理此类多系统(Auth、Storage、RealtimeDB)操作?我已经研究了 transactions,但看不到它们如何适用于此 - 文档仅显示它们用于在 RealtimeDB 中增加喜欢/星等的计数器。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

因此,主要问题是如果您尝试删除的数据仅被部分删除,该怎么办。

我认为您应该考虑一种方法,以在出现问题时帮助您恢复它。

我现在不在我的电脑上,但是我建议您尝试下载要删除的数据,并且只有在成功后才能删除本地副本,否则您应该可以轻松恢复它。

编辑:如果我们谈论大量存储而不是本地副本,您可以在云上进行。

所以你首先复制这个数据,然后删除它,然后删除数据库数据(也是之前复制的),然后你可以删除用户帐户,最后你可以删除副本。

【讨论】:

以上是关于如何分别从 Firebase Auth 和实时数据库中原子地删除用户和用户的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 firebase.auth().onAuthStateChanged 中提取数据

如何从应用程序远程强制注销firebase auth用户

如何从 firebase_auth 获取令牌

如何从 firebase_auth 测试“signInWithEmailAndPassword”

如何从 Firebase.auth.currentUser Android Kotlin 获取刷新令牌

如何在 Flutter 中从 Firebase Auth 获取用户 ID?