0

在我的应用程序中,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;
    }
  }
}

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

4

1 回答 1

1

有两种方法可以实现这一点:

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

  2. 创建一个云函数,在删除用户的帐户时删除用户的文档。

于 2020-10-02T01:27:45.263 回答