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 是不是总是在应用程序关闭后自动删除?或者,不是而且账单也在增加?

数据更改 SwiftUI 时多次调用 Firebase 侦听器

Firebase 客户端无权执行此操作

Listener学习

Firebase 云消息传递无法在某些设备上运行

Firebase 电话身份验证 (Flutter) 在某些 iOS 设备中不起作用