使用Sms验证的Firebase身份验证无法正常工作

时间:2020-01-12 09:01:02

标签: java android firebase firebase-authentication

我在Android应用程序中通过电话号码使用了Firebase身份验证。

当您第一次输入该号码时,身份验证工作正常,并且如果在提供了所提供电话号码的同一Android设备中打开该应用,则可以自动检测OTP。

但是当我再次输入手机号码时,它不会发送包含OTP的验证短信。

这是提供电话号码的班级。

public class LoginActivity extends AppCompatActivity {

    private EditText LoginPhone;
    private Button LoginConfirmButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        LoginPhone = (EditText) findViewById(R.id.PhoneNumberLogin);
        LoginConfirmButton = (Button) findViewById(R.id.Loginbutton);
        Button registerbutton=(Button)findViewById(R.id.RegisterButton);

        LoginConfirmButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String number=LoginPhone.getText().toString();
                if(number.isEmpty() || number.length()<11)
                {
                    LoginPhone.setError("Valied Number Required");
                    LoginPhone.requestFocus();
                }

                String PhoneNumber="+88"+number;
                Intent firstintent=new Intent(LoginActivity.this,CodeConfirm.class);
                firstintent.putExtra("PhoneNumber",PhoneNumber);
                startActivity(firstintent);
            }
        });

        registerbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(LoginActivity.this,User_Registration.class));
            }
        });
    }
}

这是用户可以手动放置OTP的类。

public class CodeConfirm extends AppCompatActivity {

    EditText Otpverify;
    int s;
    private String VerificationCode;
    Button confirmbutton;
    private FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_code_confirm);

        Otpverify = (EditText) findViewById(R.id.ConfirmCode);
        mAuth= FirebaseAuth.getInstance();
        String PhoneNumber = getIntent().getStringExtra("PhoneNumber");

        SendVerificationCode(PhoneNumber);

        confirmbutton=(Button)findViewById(R.id.ConfirmButton);

        confirmbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String code=Otpverify.getText().toString().trim();

                if(code.isEmpty() || code.length()<6)
                {
                    Otpverify.setError("Enter the OTP properly");
                    Otpverify.requestFocus();
                    return;
                }
                Verifycode(code);
            }
        });
    }

    private void Verifycode(String code) {
        PhoneAuthCredential credential=PhoneAuthProvider.getCredential(VerificationCode,code);
        Signin(credential);

    }

    private void Signin(PhoneAuthCredential credential) {

        mAuth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {

                if(task.isSuccessful())
                {
                    Intent WorkingSwitch=new Intent(CodeConfirm.this,Current_Location.class);
                    WorkingSwitch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(WorkingSwitch);
                }
            }
        });
    }

    private void SendVerificationCode(String Number) {

        PhoneAuthProvider.getInstance().verifyPhoneNumber(
                Number,
                60,
                TimeUnit.SECONDS,
                TaskExecutors.MAIN_THREAD,
                mCallBack
        );
    }

    private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallBack = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        @Override
        public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {

            String code=phoneAuthCredential.getSmsCode();
            if(code!=null)
            {
                Verifycode(code);
            }
        }

        @Override
        public void onVerificationFailed(FirebaseException e) {

            Toast.makeText(CodeConfirm.this,e.getMessage(),Toast.LENGTH_LONG).show();

        }

        @Override
        public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
            super.onCodeSent(s, forceResendingToken);
            VerificationCode=s;
        }
    };
}

即使多次提供相同的电话号码,我也想在每次提供该电话号码时将OTP发送给该电话号码。

1 个答案:

答案 0 :(得分:1)

如果该号码最近已被验证,该号码的验证正在进行中或最近向该号码发送的验证请求太多,则verifyPhoneNumber方法不会发送OTP。

也请注意documentation中的这一点:

为防止滥用,Firebase对一段时间内可发送到单个电话号码的SMS消息数量进行了限制。如果超出此限制,则可能会限制电话号码验证请求。如果您在开发过程中遇到此问题,请使用其他电话号码进行测试,或者稍后再尝试请求。

如果要强制其发送新的OTP,请使用从上一个onCodeSent获得的verifyPhoneNumber overload that takes a forceResendingToken parameter

如果您要发送相同的号码进行测试,则whitelisting the number是一个更好的选择。