You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase手机号验证异常:未输入验证码即成功登录求助

解决Firebase手机号验证无需输入验证码直接登录的问题

你遇到的核心问题是Firebase的自动验证机制跳过了手动输入步骤——当设备支持自动读取验证码(比如安卓系统的SMS Retriever API,或是测试环境下的自动验证逻辑),onVerificationCompleted回调会被触发,而你当前的代码直接在这个回调里调用了登录方法,导致用户不用输入验证码就完成了登录流程。

解决方案

修改onVerificationCompleted的逻辑,不要直接执行登录,而是把Firebase自动获取到的验证码填充到输入框中,引导用户手动点击验证按钮完成登录。这样既保留了自动填充的便捷性,又不会跳过验证步骤。

修改后的代码示例

callbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
    @Override
    public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
        // 不要直接登录,而是将自动获取的验证码填充到输入框,让用户手动触发验证
        String autoFilledCode = phoneAuthCredential.getSmsCode();
        if (autoFilledCode != null) {
            InputVerifcationCode.setText(autoFilledCode);
            // 切换到验证UI状态,提示用户点击验证按钮
            SendVerificationCodeButton.setVisibility(View.INVISIBLE);
            InputPhoneNumber.setVisibility(View.INVISIBLE);
            VerifyButton.setVisibility(View.VISIBLE);
            InputVerifcationCode.setVisibility(View.VISIBLE);
            Toast.makeText(MainActivity.this, "验证码已自动填充,请点击验证", Toast.LENGTH_SHORT).show();
        }
        // 注释掉原直接登录的代码
        // signInWithPhoneAuthCredential(phoneAuthCredential);
    }

    @Override
    public void onVerificationFailed(FirebaseException e) {
        loadingBar.dismiss();
        Toast.makeText(MainActivity.this, "无效手机号,请输入带国家码的正确号码...", Toast.LENGTH_SHORT).show();
        SendVerificationCodeButton.setVisibility(View.VISIBLE);
        InputPhoneNumber.setVisibility(View.VISIBLE);
        VerifyButton.setVisibility(View.INVISIBLE);
        InputVerifcationCode.setVisibility(View.INVISIBLE);
    }

    @Override
    public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken token) {
        mVerificationId = verificationId;
        mResendToken = token;
        loadingBar.dismiss();
        Toast.makeText(MainActivity.this, "验证码已发送,请查收验证", Toast.LENGTH_SHORT).show();
        SendVerificationCodeButton.setVisibility(View.INVISIBLE);
        InputPhoneNumber.setVisibility(View.INVISIBLE);
        VerifyButton.setVisibility(View.VISIBLE);
        InputVerifcationCode.setVisibility(View.VISIBLE);
    }
};

补充说明

  • onVerificationCompleted的设计初衷是优化用户体验,让支持自动验证的设备无需手动输入验证码,但如果有合规或流程要求必须让用户手动触发验证,上面的修改就能完美解决问题。
  • 确保signInWithPhoneAuthCredential方法只在用户点击VerifyButton时被调用,这样就能完全控制登录的触发时机,避免自动跳过步骤。

内容的提问来源于stack exchange,提问作者sadia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:38:00