当前位置: 首页 > 知识库问答 >
问题:

Firebase OTP验证onVerificationCompleted未调用

萧升
2023-03-14

我正在尝试设置OTP验证,所以当用户输入他们的电话号码时,我会向他们发送pin码,调用oncodent(),我会收到代码pin,但问题是当调用onVerificationCompleted()时,我想转到另一个活动,用户可以输入代码pin进行验证,但根本不会调用,我不明白为什么。任何帮助都将不胜感激,谢谢。

val auth = PhoneAuthOptions
    .newBuilder(FirebaseAuth.getInstance())
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L,TimeUnit.MILLISECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(p0: PhoneAuthCredential) {
            // here i want to get the smscode and send it over the next activity to verify
            // but this method is not called at all 
                                
            Intent(this,ChangePasswordActivity::class.java).apply {
                putExtra("code",p0.smsCode)
                startActivity(this)
            }
        }

        override fun onVerificationFailed(p0: FirebaseException) {
            Timber.d("Firebase Exception ${p0.message}")
        }

        override fun onCodeSent(code: String, p1: PhoneAuthProvider.ForceResendingToken) {
            super.onCodeSent(code, p1)
        }

        override fun onCodeAutoRetrievalTimeOut(p0: String) {
            super.onCodeAutoRetrievalTimeOut(p0)
        }
    })
    .build()

PhoneAuthProvider.verifyPhoneNumber(auth)

共有2个答案

段干子晋
2023-03-14

我也面临着这个问题,但当我将我的项目添加到谷歌云控制台、启用api服务(谷歌云控制台)和启用电话验证(谷歌云控制台)时,onVerificationCompleted工作正常。https://console.cloud.google.com/home

井宪
2023-03-14

onVerificationCompleted()只有在用户没有输入任何信息的情况下验证了电话号码后才会被调用。要想做你想做的事情,你应该把你的意图发送到oncodesnt()中。

以下是事件的大致流程(文档中详细介绍了这些事件):

  1. 获取用户的电话号码
  2. 调用PhoneAuthProvider.verifyPhoneNumber(auth)(如您已经是)将pin发送给用户
  3. onCodeSent()被调用,带有验证ID和重新发送令牌。
  4. onCodeSent()内部,创建一个使用验证ID启动“pin输入屏幕”的意图。
  5. 从用户那里获取一个pin,然后通过调用PhoneAuthCredential凭据=PhoneAuthProvider.getCredential(verficationId, userInput)
  6. 将其与验证ID相结合
  7. 使用该凭据使用signInSusCredential(凭据)登录用户。
val auth = PhoneAuthOptions
    .newBuilder(FirebaseAuth.getInstance())
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L,TimeUnit.MILLISECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // if here, phone number was verified automatically
            mAuth.signInWithCredential(credential)
                 .addOnCompleteListener(/* ... */)
        }

        override fun onVerificationFailed(p0: FirebaseException) {
            Timber.d("Firebase Exception ${p0.message}")
        }

        override fun onCodeSent(verificationId: String, resendToken: PhoneAuthProvider.ForceResendingToken) {
            // if here, code was sent to phone number
            // open pin input screen
            Intent(this,ChangePasswordActivity::class.java).apply {
                putExtra("verificationId",verificationId)
                startActivity(this)
            }
        }

        // we aren't using onCodeAutoRetrievalTimeOut, so it's omitted.
    })
    .build()

PhoneAuthProvider.verifyPhoneNumber(auth)
 类似资料:
  • 如何验证一个模拟对象根本没有被调用?我正在尝试使用Mockito测试一个接口方法的空实现。

  • 我读过很多关于这方面的帖子,但我无法解决我的问题。当我试图验证zend表单验证码时,即使文本正确,也总是失败。下面是我的代码: 谢谢你的时间和帮助!! 我看到了一些不可靠的东西:当我在联系人操作中转储$_post时,我的结果是: 我刚刚输入的验证码甚至出现了,取而代之的是验证码凯!!?? 我觉得我需要删除这个captchaField,但不知道如何到目前为止! 我可以用JS做到这一点,但必须有一个干

  • 我在SUT中有这段代码: 我知道模型不会为空,因为模型已经存在。因此,我希望不应该与model一起调用。因此,我需要某种的方法,以确保该方法不是用此参数调用的。现在我知道了如何进行相反的操作:如何确保/验证或任何方法本身是在的帮助下用参数调用的,但不确定当前的场景。请帮帮忙。 谢谢

  • 问题内容: 我正在寻找一种与Mockito进行验证的方法,即在测试过程中与给定的模拟没有任何交互。对于具有验证模式的给定方法,很容易实现这一点,但是我还没有找到完整模拟的解决方案。 我真正想要实现的是:在测试中验证,没有任何内容打印到控制台上。jUnit的总体思路如下: A 有很多方法,我真的不想用单独的验证方法来验证每个方法,而… 因此,我希望,如果有一个简单的解决方案,鉴于我具有良好的测试覆盖

  • 我实际上是在努力做下面的事情:我的服务类 这让我想要的没有被调用,实际上与这个模拟没有任何交互。你知道我做错了什么吗??

  • 我正在寻找一种方法来验证Mockito,在测试期间没有与给定的模拟进行任何交互。对于具有验证模式的给定方法,很容易实现这一点,但是我还没有找到完整模拟的解决方案。 我真正想要实现的是:在测试中验证,控制台上没有打印任何get。jUnit的总体思路如下: 一个有很多方法,我真的不想用单独的verify来验证每一个方法,对于。。。 所以我希望,如果有一个简单的解决方案,鉴于我有一个良好的测试覆盖率,我