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
相关产品推荐
相关产品推荐

