Ios 合并匿名帐户时客户端登录错误的Firebase身份验证行为
我们使用Firebase身份验证在用户启动第一个会话时匿名验证用户。稍后,他们可能会选择登录到非匿名提供商。我们使用FirebaseUI库来帮助实现这一点。FirebaseUI库有一个自动匿名升级功能(),我们使用它来简化这一过程 文档概述了我们必须处理的几个边缘案例,包括用户登录到现有帐户的帐户合并场景。发生这种情况时,我们希望将与匿名帐户关联的用户数据(在Firestore中)迁移到现有帐户,并最终登录到现有帐户。最后一步将自动且不可避免地丢弃客户端上的匿名帐户,因此我们无法恢复到该帐户 从逻辑上讲,这个合并过程并不复杂。唯一棘手的部分是使这个过程尽可能具有弹性/原子性,这样用户就不会陷入某种“不确定”状态 失败有两点。第一个是迁移用户数据时,第二个是登录到现有帐户时。我们实现原子性的想法是在用户登录到现有帐户之前开始迁移,将数据缓存在可以恢复的事务中,然后在登录成功后“提交”迁移。这样,如果数据迁移失败,以及登录失败,我们应该能够中止合并 我的问题是:如果Ios 合并匿名帐户时客户端登录错误的Firebase身份验证行为,ios,swift,firebase,firebase-authentication,firebaseui,Ios,Swift,Firebase,Firebase Authentication,Firebaseui,我们使用Firebase身份验证在用户启动第一个会话时匿名验证用户。稍后,他们可能会选择登录到非匿名提供商。我们使用FirebaseUI库来帮助实现这一点。FirebaseUI库有一个自动匿名升级功能(),我们使用它来简化这一过程 文档概述了我们必须处理的几个边缘案例,包括用户登录到现有帐户的帐户合并场景。发生这种情况时,我们希望将与匿名帐户关联的用户数据(在Firestore中)迁移到现有帐户,并最终登录到现有帐户。最后一步将自动且不可避免地丢弃客户端上的匿名帐户,因此我们无法恢复到该帐户 从
Auth.Auth().sign
返回错误,是否保证匿名帐户未被丢弃?换句话说:如果登录失败,我们是否可以继续使用当前匿名用户,或者Auth SDK是否在尝试登录时丢弃了匿名用户
下面是FirebaseUI iOS/Swift委托函数框架,我在其中指出了迁移事件。我们也愿意接受超出主要问题范围的建议。我们知道我们不是第一个实现这一想法的人,但文档/示例并没有深入到这一步
func authUI(_ authUI: FUIAuth, didSignInWith authDataResult: AuthDataResult?, error: Error?) {
if let error = error as NSError?, error.code == FUIAuthErrorCode.mergeConflict.rawValue {
// Merge conflict error, discard the anonymous user and login as the existing non-anonymous user.
guard let credential = error.userInfo[FUIAuthCredentialKey] as? AuthCredential else {
print("Received merge conflict error without auth credential!")
return
}
// Start migration process
Auth.auth().signIn(with: credential) { (dataResult, error) in
if let error = error as NSError? {
print("Failed to re-login: \(error)")
// Cancel migration process
// WE NEED TO REVERT TO THE ANONYMOUS USER!
return
}
// Finalize migration process
}
}
else if let error = error {
// Some non-merge conflict error happened.
print("Failed to log in: \(error)")
return
}
// Handle successful login
}