Firebase Listener 在某些用户通过电话身份验证登录期间不起作用
Posted
技术标签:
【中文标题】Firebase Listener 在某些用户通过电话身份验证登录期间不起作用【英文标题】:Firebase Listener not working during login of some users through phone authentication 【发布时间】:2020-08-17 14:02:38 【问题描述】:更新:当所有遇到此问题的用户更改移动运营商后,问题就消失了。当他们转移回原来的承运人时,问题没有再次出现。虽然现在一切正常,但如果我能确定错误的原因以便将来正确处理它会有所帮助
我的应用程序中的用户正在通过 Firebase 电话身份验证登录。突然之前一切正常,对于一些之前登录应用程序但随后他们的数据被删除的用户,无法重新登录系统。这些用户的身份验证过程和登录已停止工作。我将首先提供代码,然后详细写出我到目前为止所了解的内容。我做了一些祝酒词(不记录,因为这些用户是远程的)来了解流程。
首先我验证输入的电话号码:
fun verify()
verificationCallBacks()
val mobile = "+91"+MobileNumber.text.toString()
PhoneAuthProvider.getInstance().verifyPhoneNumber(
mobile,
60,
TimeUnit.SECONDS,
this,
mCallbacks
)
fun verificationCallBacks()
mCallbacks = object: PhoneAuthProvider.OnVerificationStateChangedCallbacks()
override fun onVerificationCompleted(credential: PhoneAuthCredential)
Toast.makeText(this@Login, "Automatic", Toast.LENGTH_LONG).show()
signIn(credential)
override fun onVerificationFailed(p0: FirebaseException)
Toast.makeText(this@Login, p0.toString(), Toast.LENGTH_SHORT).show()
override fun onCodeSent(p0: String, p1: PhoneAuthProvider.ForceResendingToken)
Toast.makeText(this@Login, "Verification ", Toast.LENGTH_LONG).show()
super.onCodeSent(p0, p1)
verificationID = p0
验证回调后,在平常的一天,一些用户会自动登录,而一些用户通过验证短信进行身份验证。登录和认证(通过验证短信登录)的代码如下:
fun authenticate()
if(Verification.text.toString().trim().isNotEmpty())
val verifyCode = Verification.text.toString()
val credential: PhoneAuthCredential =
PhoneAuthProvider.getCredential(verificationID, verifyCode)
signIn(credential)
fun signIn(credential: PhoneAuthCredential)
mAuth.signInWithCredential(credential)
.addOnCompleteListener
task: Task<AuthResult> ->
if(task.isSuccessful)
saveUserToFirebaseDatabase()
else
if (task.exception is FirebaseAuthInvalidCredentialsException)
Toast.makeText(this@Login, "Error Logging you in", Toast.LENGTH_SHORT).show()
在登录方法之后,如果用户不存在,则将用户保存到数据库,或者他存在,然后更新其他内容,如下所示:
fun saveUserToFirebaseDatabase()
val uid = mAuth.uid ?: ""
ref1 = newref.child(uid)
Toast.makeText(this@Login, uid, Toast.LENGTH_LONG).show()
listenerA1 = ref1.addValueEventListener(object : ValueEventListener
override fun onCancelled(p0: DatabaseError)
Toast.makeText(this@Login, p0.message, Toast.LENGTH_LONG).show()
override fun onDataChange(p0: DataSnapshot)
if(p0.exists())
**** Do Something *****
else
**** Do Something *****
)
对于我之前描述的用户,我看到的是他们的身份验证已完成,但他们无法连接到数据库。我能够弄清楚的代码执行顺序如下:
1) 在验证回调中,自动登录 (onVerificationCompleted) 和验证短信 (onCodeSent) 都会被触发。我不确定是否应该如此。
2) 自动签到直接执行签到函数。
3) 在signIn函数中生成uid,并显示出来。但在那之后,firebase 侦听器没有附加。因此,用户无法连接到数据库。没有针对 p0.message 显示关于数据库错误的消息。
4) 同时用户也会收到验证码。他输入相同的内容,然后执行再次将他带到 signIn 函数。但随后他收到“登录时出错”消息。发生此错误是因为 Firebase 在“发送的短信已过期”时引发了无效异常
在过去的 48 小时里,我一直在摸不着头脑,无法弄清楚为什么会发生这种情况。有人可以帮忙吗
【问题讨论】:
遇到类似问题,您找到解决方案了吗? 不......即使是 Firebase 支持团队也无法检测到任何东西。似乎是运营商特定的问题 嗯,好的。我的问题出在 php 脚本服务器端。 【参考方案1】:这可能会或可能不会回答您的问题,但这是我对 Firebase Auth 的了解 如果您使用多个身份验证提供程序,例如Google + Phone 在您的应用中第一次运行良好, 但是当您重置应用程序时,请说清除应用程序数据,然后先尝试使用电话号码再次登录,它只会给您一个错误,而没有任何有用的消息或错误代码。 为了解决这个问题,我通过搜索电话号码从 Firebase 控制台手动删除/删除了该特定帐户。 删除帐户后,我可以使用相同的电话号码再次登录。 您可以尝试从控制台删除电话号码帐户,看看是否能解决您的问题。
【讨论】:
我的系统中只有电话验证 您是否尝试删除手机帐户? 是的,我做到了……然后问题就开始了。我在上面报告了一个更新。以上是关于Firebase Listener 在某些用户通过电话身份验证登录期间不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Firebase onDataChange Listener 是不是总是在应用程序关闭后自动删除?或者,不是而且账单也在增加?