ios - 从 Firebase 中删除 Google 或 Facebook 用户

标签 ios swift firebase firebase-authentication

要从身份验证选项卡中删除用户,我使用以下代码:

    if let user = FIRAuth.auth()?.currentUser{
            user.delete(completion: nil)
    }

当用户使用电子邮件/密码组合注册时,这工作得很好,但当他们使用社交帐户注册时,它们不会被删除,我仍然可以在“身份验证”选项卡中看到他们的电子邮件、UID 等。

如何从 Firebase 中删除这些用户?

提前致谢

最佳答案

谢谢 Jogendra,重新身份验证是解决我的问题的关键,我接受了答案。这是使用 Swift 3 的完整答案,其中包含用于检索用户凭据的代码。

 func deleteAllUserData(){
        if let user = FIRAuth.auth()?.currentUser{
            user.delete(completion: { (err) in
                if(err != nil){
                print(err!.localizedDescription)
                //Try to re-authenticate if there is an error
                self.getProvider()
                }else{
                self.deleteData()
                }
            })
        }
    }

//There are different methods to retrieve the credentials based on the auth type so you first need to know which type of authentication is being used

     func getProvider(){
        if let providerData = FIRAuth.auth()?.currentUser?.providerData {
            for userInfo in providerData {
                switch userInfo.providerID {
                case "facebook.com":
                    if let credential = facebookCredential(){
                        self.reauthenticate(credential: credential)
                    }
                case "google.com":
                    if let credential = googleCredential(){
                        self.reauthenticate(credential: credential)
                    }
                    print("user is signed in with google")
              case "password":
                    let alert = UIAlertController(title: "Sign In", message: "Please Sign In again to your Locket account to confirm that you want to delete all your data", preferredStyle: .alert)
                    alert.addTextField { (textField: UITextField) in
                        textField.placeholder = "Email"
                    }
                    alert.addTextField { (textField: UITextField) in
                        textField.placeholder = "Password"
                        textField.isSecureTextEntry = true
                    }
                    let noAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

                    let yesAction = UIAlertAction(title: "OK", style: .destructive, handler: { (action:UIAlertAction) in
                         let emailTextField = alert.textFields![0]
                         let passwordTextField = alert.textFields![1]

                        if let credential = self.emailCredential(email: emailTextField.text!, password: passwordTextField.text!){
                            self.reauthenticate(credential: credential)
                        }else{
                            print("error")
                        }
                    })
                    alert.addAction(yesAction)
                    alert.addAction(noAction)

                self.present(alert, animated: true, completion: nil)
                default:
                print("unknown auth provider")


                }
            }
            }
        }

   func reauthenticate(credential:FIRAuthCredential){
        FIRAuth.auth()?.currentUser?.reauthenticate(with: credential) { error in
            if let error = error {
                print("reauth error \(error.localizedDescription)")
            } else {
                print("no reauth error")
                self.deleteData()
            }
        }
    }

    func facebookCredential() -> FIRAuthCredential? {
        let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)
        return credential
    }

    func emailCredential(email:String,password:String) -> FIRAuthCredential? {
       let credential = FIREmailPasswordAuthProvider.credential(withEmail: email, password: password)
       return credential
    }

    func googleCredential() -> FIRAuthCredential? {
        guard let user = GIDSignIn.sharedInstance().currentUser else {return nil}
        guard let authentication = user.authentication else {return nil}
        let credential = FIRGoogleAuthProvider.credential(withIDToken: authentication.idToken, accessToken: authentication.accessToken)
        return credential
    }


     func deleteData(){
            // Delete all other data related to user
        }

关于ios - 从 Firebase 中删除 Google 或 Facebook 用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49564571/

相关文章:

ios - 使用路径提取 UIImage

swift - 具有关联值的枚举的优雅序列化/反序列化

ios - 通过在 iOS 中连接表从 Firebase 获取数据

ios - 前向申报摊位应用程序

ios - NSLayout 约束隐藏 UIView

iphone - 在iPhone中打开Skype或Gtalk

swift - 如何弹出 View Controller 然后显示 UIAlertController

Swift:旋转时渐变 split

ios - Firebase 崩溃报告多个问题

javascript - 如何在 Firebase Cloud 函数中执行类似 'child-added' 事件的操作?