【问题标题】:Swift Delete User from Firestore and AuthenticationSwift 从 Firestore 和身份验证中删除用户
【发布时间】:2020-10-02 01:11:02
【问题描述】:

在我的应用程序中,user 应该能够删除该帐户。我正在努力完成这项工作,因为我必须从数据库和身份验证中删除。

我以为我可以先deleteFromAuthentication,然后再deleteEntryFromDatabase。这些都是功能:

//MARK: deleteUserFromDatabase
static func deleteUserEntryFromDatabase(oldUserId: String, finished: @escaping (_ done: Bool) -> Void) {
    Auth.auth().signInAnonymously() { (authResult, error) in
        let db = Firestore.firestore()
        db.collection("users").document(oldUserId).delete() { err in
            if err != nil {
                Utilities.showErrorPopUp(labelContent: "Fehler", description: err!.localizedDescription)
                finished(false)
            } else {
                finished(true)
            }
        }
    }
    
}

//MARK: deleteUserFromAuthentication
static func deleteUserFromAuthentication(finished: @escaping (_ done: Bool, _ hasToReauthenticate: Bool) -> Void) {
    let user = Auth.auth().currentUser
    user?.delete { err in
        if err != nil {
            if let errCode = AuthErrorCode(rawValue: err!._code) {
                switch errCode {
                    case .requiresRecentLogin:
                        finished(true, true)
                default:
                 Utilities.showErrorPopUp(labelContent: "Fehler", description: err!.localizedDescription)
                    finished(false, false)
                }
            }
        } else {
            finished(true, false)
        }
    }
}

我如何使用它们:

func deleteAccount() {
    var uid = ""
    if let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey) {
        uid = defaults.getUid()!
        defaults.synchronize()
    }
    
    DataHandler.deleteUserFromAuthentication { (finished, hasToReauthenticate) in
        if finished {
            if hasToReauthenticate {
                self.showReauthenticationAlert()
            } else {
                DataHandler.deleteUserEntryFromDatabase(oldUserId: uid) { (finished) in
                    if finished {
                        let firstLaunchVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "FirstLaunchVC")
                        self.navigationController?.pushViewController(firstLaunchVC, animated: false)
                        
                        if let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey) {
                            defaults.removePersistentDomain(forName: UserDefaults.Keys.groupKey)
                            defaults.synchronize()
                        }
                    } else {
                        self.loadingFailed()
                    }
                }
            }
        } else {
            self.loadingFailed()
        }
    }
}

但是这不起作用,因为我收到错误 insufficient permissions。我以为我可以使用 signInAnonymously 解决此问题,但显然这不起作用。

这些是我的Cloud-Firestore-Rules

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if request.auth != null;
    }
  }
}

有人可以帮我吗?我希望一切都清楚,如果您需要更多信息,请告诉我。

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore firebase-authentication


    【解决方案1】:

    有两种方法可以实现:

    1. 在客户端代码中:首先从数据库中删除用户的文档,然后才删除他们的帐户。因此,订单与您现在的操作完全相反,因为一旦帐户被删除,就没有安全的方法可以从客户那里删除帐户。 IE。如果您使当前的方法有效,那么任何人都可以删除其他任何人的用户文档,这是一个很大的安全风险。

    2. 创建一个云函数,当他们account is deleted 时删除用户的文档。

    【讨论】:

    • 第二个选项更适合我的情况。你能详细说明一下吗?
    • 这有点超出了这里的合理范围。我链接的页面有一个如何在用户删除时触发云功能的示例。然后,您可以在该代码中使用 Admin SDK 删除用户的文档。我建议尝试使用文档和那里的许多教程。如果您在尝试后遇到困难,我建议您通过minimal code that reproduce where you got stuck 发布问题。
    • 什么是正确的 Swift 语法?在此找不到任何内容
    • 这是因为 Cloud Functions 是用 Node.js 编写的,并且在 Google 的服务器上运行。我在your new question 上的回答也差不多。
    猜你喜欢
    • 1970-01-01
    • 2021-02-28
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2021-06-11
    相关资源
    最近更新 更多