【问题标题】:FirebaseAuthUserCollisionException vs FirebaseAuthInvalidUserException when user account is disabled?禁用用户帐户时的 FirebaseAuthUserCollisionException 与 FirebaseAuthInvalidUserException?
【发布时间】:2020-04-27 22:33:43
【问题描述】:

我目前正在开发一个使用 FirebaseAuth 来控制用户的安卓应用。 用户可以使用电子邮件或 Google 登录。

考虑到这一点,我正在捕捉一些异常以处理身份验证系统的任何问题。

其中大部分都可以正常工作。这是我的代码:

    when(task.exception!!){
        is FirebaseAuthEmailException -> {
            errorDialogBuilder.setTitle(R.string.exception_email_title)
            errorDialogBuilder.setMessage(getString(R.string.exception_email_msg, task.exception!!.localizedMessage))
        }
        is FirebaseAuthInvalidCredentialsException -> {
            errorDialogBuilder.setTitle(R.string.exception_invalid_credentials_title)
            errorDialogBuilder.setMessage(getString(R.string.exception_invalid_credentials_msg, task.exception!!.localizedMessage))
        }
        is FirebaseAuthInvalidUserException -> {
            val invalidUserException = task.exception!! as FirebaseAuthInvalidUserException
            when (invalidUserException.errorCode) {
                "ERROR_USER_DISABLED" -> {
                    errorDialogBuilder.setTitle(R.string.exception_user_disabled_title)
                    errorDialogBuilder.setMessage(R.string.exception_user_disabled_msg)
                    errorDialogBuilder.setNeutralButton(R.string.more, null)
                }
                "ERROR_USER_NOT_FOUND" -> {
                    errorDialogBuilder.setTitle(R.string.exception_user_not_found_title)
                    errorDialogBuilder.setMessage(getString(R.string.exception_user_not_found_msg, fragmentView.email_input_signin.text.toString()))
                    errorDialogBuilder.setNeutralButton(R.string.action_createnew_account) { _, _ ->
                        viewModel.createUser(fragmentView.email_input_signin.text.toString(), fragmentView.email_password.text.toString())
                    }
                }
                else -> {
                    errorDialogBuilder.setTitle(invalidUserException.errorCode)
                    errorDialogBuilder.setMessage(invalidUserException.localizedMessage)

                }
            }
        }
    }

将此代码用于开发目的时,我没有遇到任何问题。但是我发现了一些非常奇怪的东西: 我在玩禁用用户;出现此问题:每当我禁用 google 帐户时,会抛出 FirebaseAuthInvalidUserException 代码 ERROR_USER_DISABLED,就像尝试使用已禁用的基于电子邮件的帐户登录时一样,但 FirebaseUserCollissionException与带有代码ERROR_USER_DISABLEDFirebaseAuthInvalidUserException 具有完全相同的消息:

com.google.firebase.auth.FirebaseAuthUserCollisionException: The user account has been disabled by an administrator.
    at com.google.firebase.auth.api.internal.zzdx.zza(com.google.firebase:firebase-auth@@19.1.0:42)
    at com.google.firebase.auth.api.internal.zzfa.zza(com.google.firebase:firebase-auth@@19.1.0:19)
    at com.google.firebase.auth.api.internal.zzet.zza(com.google.firebase:firebase-auth@@19.1.0:34)
    at com.google.firebase.auth.api.internal.zzev.zza(com.google.firebase:firebase-auth@@19.1.0:98)
    at com.google.firebase.auth.api.internal.zzev.zza(com.google.firebase:firebase-auth@@19.1.0:85)
    at com.google.firebase.auth.api.internal.zzed.zza(com.google.firebase:firebase-auth@@19.1.0:43)
    at com.google.android.gms.internal.firebase_auth.zza.onTransact(com.google.firebase:firebase-auth@@19.1.0:13)
    at android.os.Binder.execTransactInternal(Binder.java:1021)
    at android.os.Binder.execTransact(Binder.java:994)

当尝试使用已禁用的基于电子邮件的帐户时,这是正常的外观(已处理且有效):

com.google.firebase.auth.FirebaseAuthInvalidUserException: The user account has been disabled by an administrator.
    at com.google.firebase.auth.api.internal.zzdx.zza(com.google.firebase:firebase-auth@@19.1.0:6)
    at com.google.firebase.auth.api.internal.zzfa.zza(com.google.firebase:firebase-auth@@19.1.0:21)
    at com.google.firebase.auth.api.internal.zzet.zza(com.google.firebase:firebase-auth@@19.1.0:34)
    at com.google.firebase.auth.api.internal.zzev.zza(com.google.firebase:firebase-auth@@19.1.0:74)
    at com.google.firebase.auth.api.internal.zzed.zza(com.google.firebase:firebase-auth@@19.1.0:18)
    at com.google.android.gms.internal.firebase_auth.zza.onTransact(com.google.firebase:firebase-auth@@19.1.0:13)
    at android.os.Binder.execTransactInternal(Binder.java:1021)
    at android.os.Binder.execTransact(Binder.java:994)

为什么这里使用了两个不同的例外?当用户帐户被禁用时,为什么firebase会抛出FirebaseAuthUserCollisionException,因为据我从docs知道,FirebaseAuthUserCollisionException只有在用户帐户冲突时才会抛出?

另外: firebase 文档的简短摘录:

FirebaseAuthUserCollisionException

公共最终类 FirebaseAuthUserCollisionException 扩展 FirebaseAuthException

无法对 FirebaseUser 实例执行操作时引发 由于与另一个现有用户发生冲突而完成。

【问题讨论】:

    标签: android firebase authentication firebase-authentication


    【解决方案1】:

    这很奇怪。我阅读了适用于 Android 文档的 Google API - 你说的是正确的 - FirebaseAuthUserCollisionException 应该只在 Firebase 用户之间发生冲突时抛出,特别是如果两者意外共享相同的凭据,但我认为 Firebase Auth 不允许这样做它可以从一开始就检测两个或更多用户之间的凭据是否相似。

    我认为 Firebase Auth 在您使用它登录时会尝试将已禁用的 Google 帐户重新注册/重新添加到系统中。由于 Google 帐户已被禁用,Firebase Auth 可能会认为该帐户无效 - 但该帐户仍然保留并记录在身份验证系统中 - 因此,如果您尝试使用之前禁用的 Google 帐户登录,Firebase 身份验证会尝试重新添加该帐户并与之前禁用的 Google 帐户记录发生冲突。

    这也有可能是 Firebase 身份验证方面的错误/故障/错误。

    如果您询问差异,我认为更多的是导致这些异常发生的情况/条件;大多数例外都是相似的,不同的是错误的目的和原因。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的扩展回答。我会看看这是否是我的问题,稍后我会回复你。
    • 祝你好运!如果您需要什么,请告诉我。
    猜你喜欢
    • 2020-05-20
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多