Android Java-仅当用户手机号码已在Firebase实时数据库中时,如何生成和验证OTP

Android Java-仅当用户手机号码已在Firebase实时数据库中时,如何生成和验证OTP,java,android,firebase,firebase-realtime-database,firebase-authentication,Java,Android,Firebase,Firebase Realtime Database,Firebase Authentication,我正在做一个项目,只有当用户数据已经在Firebase实时数据库中时,才应该进行登录,不需要注册新用户,我只需要与现有用户一起工作。我当前的代码生成并验证OTP,无论用户手机号码是否已存在。那么,我如何修改以达到我的目的呢 这是我的密码: package com.lalbhaibrokers.lalbhaibrokerspvtltd; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActiv

我正在做一个项目,只有当用户数据已经在Firebase实时数据库中时,才应该进行登录,不需要注册新用户,我只需要与现有用户一起工作。我当前的代码生成并验证OTP,无论用户手机号码是否已存在。那么,我如何修改以达到我的目的呢

这是我的密码:

package com.lalbhaibrokers.lalbhaibrokerspvtltd;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.TaskExecutors;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.FirebaseException;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthProvider;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.concurrent.TimeUnit;

public class LoginActivity extends AppCompatActivity {

    //Variables
    TextInputEditText mobileNumber, otp;
    TextView forgotPassword, errorMessage, sendOtp, verifyOtpAndLogin;
    Context context = this;
    String verificationCode;
    boolean isVerified;
    FirebaseDatabase database;
    DatabaseReference reference;

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

        //Hooks
        mobileNumber = (TextInputEditText) findViewById(R.id.mobile_no_editText);
        otp = (TextInputEditText) findViewById(R.id.otp_editText);
        errorMessage = (TextView) findViewById(R.id.error_message_textView);
        sendOtp = (TextView) findViewById(R.id.send_otp_btn);
        verifyOtpAndLogin = (TextView) findViewById(R.id.verify_otp_and_login);

        verifyOtpAndLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String userCode = otp.getText().toString();
                if (!userCode.isEmpty()) {
                    verifyCode(userCode); //verifying the code Entered by user
                }
            }
        });
    }

    //method for start the OTP process
    public void sendOtp(View view){
        if(mobileNumber.getText().toString().equals("")){
            errorMessage.setText("Please Enter phone number");
            errorMessage.setVisibility(View.VISIBLE);
        }else if(mobileNumber.getText().toString().length() != 10){
            errorMessage.setText("PhoneNumber is Invalid"); //we can only accept phoneNumbers with 10 digits
            errorMessage.setVisibility(View.VISIBLE);
        }else{
            String phoneNum= "+91"+mobileNumber.getText().toString(); //we have to add country code in order to receive OTP

            //method that will send the OTP to given number
            PhoneAuthProvider.getInstance().verifyPhoneNumber( //sending message
                    phoneNum,        // Phone number to verify
                    60,                 // Timeout duration
                    TimeUnit.SECONDS,   // Unit of timeout
                    TaskExecutors.MAIN_THREAD,    // Activity (for callback binding)
                    mCallbacks);        // OnVerificationStateChangedCallbacks
            Toast.makeText(context, "OTP send to"+phoneNum, Toast.LENGTH_SHORT).show();
            verifyOtpAndLogin.setVisibility(View.VISIBLE);
        }
    }

    //method that verify the OTP received or not
    private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        @Override
        public void onCodeSent(@NonNull String s, @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
            super.onCodeSent(s, forceResendingToken);
            verificationCode = s;   //verification code that should be received by phoneNumber
        }

        @Override
        public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
            String code = phoneAuthCredential.getSmsCode(); //verification code that actually received by phoneNumber
            if (code != null) {
                verifyCode(code);
            }
        }

        @Override
        public void onVerificationFailed(@NonNull FirebaseException e) {
            Toast.makeText(context, "Verification Failed: OTP not received", Toast.LENGTH_SHORT).show();
        }
    };

    //verifying the OTP
    public void verifyCode(String code) {
        PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationCode, code); //comparing both verification code
        signin(credential);
    }

    //signing in the User to update in database
    private void signin(PhoneAuthCredential credential) {
        FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
        firebaseAuth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    Toast.makeText(context, "Verification Complete", Toast.LENGTH_SHORT).show();
                    isVerified=true;
                    Intent intent = new Intent(context, UserDashboard.class);
                    startActivity(intent);
                    finish();
                } else {
                    Toast.makeText(context, "Verification Faild: OTP wrong", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}
package com.lalbhaibrokers.lalbhaibrokerspvtltd;
导入androidx.annotation.NonNull;
导入androidx.appcompat.app.appcompat活动;
导入android.content.Context;
导入android.content.Intent;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.google.android.gms.tasks.OnCompleteListener;
导入com.google.android.gms.tasks.Task;
导入com.google.android.gms.tasks.TaskExecutors;
导入com.google.android.material.textfield.textinputtext;
导入com.google.firebase.FirebaseException;
导入com.google.firebase.auth.AuthResult;
导入com.google.firebase.auth.FirebaseAuth;
导入com.google.firebase.auth.PhoneAuthCredential;
导入com.google.firebase.auth.PhoneAuthProvider;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入java.util.concurrent.TimeUnit;
公共类LoginActivity扩展了AppCompatActivity{
//变数
text输入text移动枚举器,otp;
TextView放弃密码、错误消息、发送、验证和登录;
上下文=这个;
字符串验证码;
验证布尔值;
Firebase数据库;
数据库参考;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u登录);
//钩子
mobileNumber=(textInputItemText)findViewById(R.id.mobile\u no\u editText);
otp=(textInputItemText)findViewById(R.id.otp_editText);
errorMessage=(TextView)findViewById(R.id.error\u message\u TextView);
sendOtp=(TextView)findViewById(R.id.send\u otp\u btn);
verifyOtpAndLogin=(TextView)findViewById(R.id.verify\u otp\u和\u login);
verifyOtpAndLogin.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
字符串userCode=otp.getText().toString();
如果(!userCode.isEmpty()){
verifyCode(userCode);//验证用户输入的代码
}
}
});
}
//启动OTP进程的方法
公共void sendOtp(视图){
if(mobileNumber.getText().toString().equals(“”){
errorMessage.setText(“请输入电话号码”);
errorMessage.setVisibility(View.VISIBLE);
}else if(mobileNumber.getText().toString().length()!=10){
errorMessage.setText(“电话号码无效”);//我们只能接受10位数的电话号码
errorMessage.setVisibility(View.VISIBLE);
}否则{
String phoneNum=“+91”+mobileNumber.getText().toString();//我们必须添加国家代码才能接收OTP
//将OTP发送到给定号码的方法
PhoneAuthProvider.getInstance().verifyPhoneNumber(//发送消息
phoneNum,//要验证的电话号码
60,//超时持续时间
TimeUnit.SECONDS,//超时单位
TaskExecutors.MAIN\u线程,//活动(用于回调绑定)
mCallbacks);//OnVerificationStateChangedCallbacks
Toast.makeText(上下文,“OTP发送到”+phoneNum,Toast.LENGTH_SHORT).show();
verifyOtpAndLogin.setVisibility(View.VISIBLE);
}
}
//验证是否接收到OTP的方法
私有PhoneAuthProvider.OnVerificationStateChangedCallbacks McCallbacks=新PhoneAuthProvider.OnVerificationStateChangedCallbacks(){
@凌驾
public void onCodeSent(@NonNull String s,@NonNull PhoneAuthProvider.ForceResendingToken ForceResendingToken){
超级OnCondent(s,forceResendingToken);
verificationCode=s;//应该由phoneNumber接收的验证代码
}
@凌驾
public void onVerificationCompleted(@NonNull PhoneAuthCredential PhoneAuthCredential){
String code=phoneAuthCredential.getSmsCode();//phoneNumber实际接收的验证代码
如果(代码!=null){
验证码(code);
}
}
@凌驾
public void onVerificationFailed(@NonNull FirebaseException e){
Toast.makeText(上下文,“验证失败:未收到OTP”,Toast.LENGTH_SHORT.show();
}
};
//核实检察官办公室
公共无效验证码(字符串码){
PhoneAuthCredential credential=PhoneAuthProvider.getCredential(验证代码,代码);//比较两个验证代码
签名(凭证);
}
//登录要在数据库中更新的用户
私有无效登录(PhoneAuthCredential凭据){
FirebaseAuth FirebaseAuth=FirebaseAuth.getInstance();
firebaseAuth.signInWithCredential(凭证).addOnCompleteListener(新OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Toast.makeText(上下文,“验证完成”,Toast.LENGTH_SHORT).show();
isVerified=true;
意图=新意图(上下文,UserDashboard.class);
星触觉(意向);
完成();
}否则{
Toast.makeText(上下文,“验证失败:OT
                if (task.isSuccessful()) {
                //verify UID here
                    Toast.makeText(context, "Verification Complete", Toast.LENGTH_SHORT).show();
                    isVerified=true;
                    Intent intent = new Intent(context, UserDashboard.class);
                    startActivity(intent);
                    finish();
                } else {
                    Toast.makeText(context, "Verification Faild: OTP wrong", Toast.LENGTH_SHORT).show();
                }
            }
        });