从Auth数据库中删除匿名用户

时间:2017-01-09 19:06:39

标签: ios swift firebase firebase-realtime-database firebase-authentication

我使用的是 Firebase 数据库,并且对下一个情况感到困惑。

让我们想象我有todo应用程序。我在用户设备之间使用标准Firebase Auth系统进行同步items。但在其他情况下,用户可以匿名工作而不进行同步。

第1步:

第一次用户启动应用,并在AppDelegate我创建了匿名用户:

FIRAuth.auth()?.addStateDidChangeListener { auth, user in
  if let _user = user {
    if _user.isAnonymous {
        print("User logged in as anonymous. Saving uid to user defaults storage.")
        UserDefaults.standard.setValue(_user.uid, forKey: "uid")
    } else {
         print("User logged in with email: \(_user.email)")
    }
  } else {
     FIRAuth.auth()?.signInAnonymously() { (user, error) in
        if let _error = error {
           print("Anonymous signIn error: \(_error)")
        }
     }
  }
}

第2步:

这位匿名用户创建了几个待办事项并决定了signUp:

let credential = FIREmailPasswordAuthProvider.credential(withEmail: emailField.text!, password: passwordField.text!)
FIRAuth.auth()?.currentUser?.link(with: credential, completion: { user, error in
    if error == nil {
        FIRAuth.auth()!.signIn(withEmail: emailField.text!,
                                       password: passwordField.text!)
     }
 })

所以我修改了以前的代码并更改了创建的待办事项的所有者:

if let prevUserUID = UserDefaults.standard.string(forKey: "uid"), prevUserUID != _user.uid {
    FIRDatabase.database().reference().child("todo-items").queryOrdered(byChild: "user").queryEqual(toValue: prevUserUID).observe(.value, with: { snapshot in
    for item in snapshot.children {
        var todoItem = TodoItem(snapshot: item as! FIRDataSnapshot)
        todoItem.user = _user.uid
        todoItem.ref?.setValue(todoItem.toAnyObject())
    }
  })
  print("Data migrated.")
}

好的一切正常。但是,现在用户退出了。我创建了一个新的匿名用户。然后他再次登录,我合并数据。但我无法联系帐户,因为我之前已经这样做了。我无法从Auth数据库(my question)中删除匿名用户。我们得到僵尸!未使用的匿名帐户。如果用户将登录/注销1000次,我们将获得1000个匿名帐户。

1 个答案:

答案 0 :(得分:1)

当您将凭据与当前已记录的当前用户链接时,不需要:

FIRAuth.auth()!.signIn

保留匿名用户的UID。

如果用户已拥有帐户,则需要:

currentUser.delete()

然后使用提供的凭据登录