【问题标题】:How to send SMS with confirmation code using Firebase?如何使用 Firebase 发送带有确认码的短信?
【发布时间】:2020-11-08 01:55:45
【问题描述】:

我的应用中有两组人——经理和员工。经理可以注册他们的员工。基本上他们会为他们填写表格(电话号码、全名、出生日期等)。所有信息都保存在 Cloud firebase 的 employees 集合中。

员工无法注册应用程序,只能“验证他们的电话号码”。如果他们的电话号码已在系统中注册,那么他们应该会收到一条带有确认码的短信。如您所见,我目前将员工信息保存在数据库中,而不是在身份验证部分(就像我为使用电子邮件和密码登录的经理所做的那样)。

思路如下:

  1. 经理应该注册志愿者的电话号码(据我了解,身份验证部分)。
  2. 员工安装应用程序并在登录部分输入他们的电话号码。应向他们发送另一条短信,其中包含员工应填写的确认码。

所以我有两个问题:

  1. 除了在 Firebase 云中添加员工之外,我应该如何添加员工?
  2. 当员工尝试使用电话号码登录时,我如何检查他是否已经在系统中,如果没有,打印敬酒什么的?
  3. 一个更难的问题是我应该如何发送短信确认码?

我还想提一下,我不使用 FirebaseUI(我们有一个自定义的登录视图)。

【问题讨论】:

    标签: java android firebase firebase-authentication


    【解决方案1】:

    您可以这样做,使用此代码发送 otp:

    private String verificationCode = "";
            
    private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallback;
    
    sendOtp();
    varifyMobile();
    
    
    private void sendOtp() {
        auth = FirebaseAuth.getInstance();
        mCallback = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
            }
    
            @Override
            public void onVerificationFailed(FirebaseException e) {
                pd.dismiss();
                Toast.makeText(OtpVerificationActivity.this, "OTP Sent failed, Please click on Resend OTP.", Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                super.onCodeSent(s, forceResendingToken);
                pd.dismiss();
                verificationCode = s;
                Toast.makeText(OtpVerificationActivity.this, "OTP has been sent on " + mobile, Toast.LENGTH_SHORT).show();
            }
        };
    }
    
    private void varifyMobile() {
        PhoneAuthProvider.getInstance().verifyPhoneNumber(
                "+91" + mobile,                     // Phone number to verify
                2,                           // Timeout duration
                TimeUnit.MINUTES,                // Unit of timeout
                OtpVerificationActivity.this,        // Activity (for callback binding)
                mCallback);
    }
    

    对于验证 Otp:

    String otp = edtOtp.getText().toString();
                        PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationCode, otp);
                        SigninWithPhone(credential);
    
    private void SigninWithPhone(PhoneAuthCredential credential) {
        auth.signInWithCredential(credential)
                        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                if (task.isSuccessful()) {
                                    Toast.makeText(OtpVerificationActivity.this, "Otp verification complete", Toast.LENGTH_SHORT).show();
                                } else {
                                    pd.dismiss();
                                    Toast.makeText(OtpVerificationActivity.this, "Error: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                                }
                            }
                        });
    }
    

    【讨论】:

    • 你能解释一下代码的去向吗?我想sendOtp应该在经理填写完表格后执行,varifyMobile应该在员工点击“验证号码”时执行?还有sendOtp 发送什么?
    • 当你想发送 otp 时你必须调用这两种方法
    • 好的,谢谢,第一个代码在经理屏幕上,第二个代码在员工屏幕上,对吧?你能解释一下sendOtp 的作用吗?它会向员工发送短信吗?因为它不应该。
    • 发送 otp 设置回调详细信息并验证Mobile 正在发送 otp
    • 我现在试过了。当经理注册员工时,它会发送一个验证码。正如我所提到的,我希望仅在员工尝试自己登录时发送验证码。如何在不发送验证码的情况下注册用户?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多