【发布时间】: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_DISABLED 的FirebaseAuthInvalidUserException 具有完全相同的消息:
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