如何在Firebase Phone Authentication Android中重新发送短信验证?

时间:2017-06-22 01:41:37

标签: android firebase firebase-authentication sms-verification

根据Firebase文档(https://firebase.google.com/docs/auth/android/phone-auth#send-a-verification-code-to-the-users-phone),有callback来处理电话号码验证。

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(PhoneAuthCredential credential) {

        Log.d(TAG, "onVerificationCompleted:" + credential);
        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(FirebaseException e) {

        Log.w(TAG, "onVerificationFailed", e);
    }

    @Override
    public void onCodeSent(String verificationId,
                           PhoneAuthProvider.ForceResendingToken token) {

        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

我的问题是onCodeSent方法。它在这里的文件(https://firebase.google.com/docs/reference/android/com/google/firebase/auth/PhoneAuthProvider.ForceResendingToken

上说

可以使用token强制重新发送短信验证码。但是,在对文档进行一些研究后,我仍然不知道如何。

我想问一下如何使用此token重新发送短信验证?

4 个答案:

答案 0 :(得分:16)

来源:Github

这是用于重新发送SMS验证的方法。

private void resendVerificationCode(String phoneNumber,
                                    PhoneAuthProvider.ForceResendingToken token) {
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phoneNumber,        // Phone number to verify
            60,                 // Timeout duration
            TimeUnit.SECONDS,   // Unit of timeout
            this,               // Activity (for callback binding)
            mCallbacks,         // OnVerificationStateChangedCallbacks
            token);             // ForceResendingToken from callbacks
}

答案 1 :(得分:0)

您可以使用Firebase方法重新发送验证码,如PERSISTENCE和拦截短信代码,以便自动签入,例如在运行进度对话框时,对用户透明,只需

// [START resend_verification]
public void resendVerificationCode(String phoneNumber,
                                   PhoneAuthProvider.ForceResendingToken token) {
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phoneNumber,        // Phone number to verify
            60,                 // Timeout duration
            TimeUnit.SECONDS,   // Unit of timeout
            activity,           //a reference to an activity if this method is in a custom service
            mCallbacks);        // resending
    // [END start_phone_auth]
}

用片段中的广播接收器检查短信

private BroadcastReceiver smsBroadcastReceiver;
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
public static final String SMS_BUNDLE = "pdus";

 @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    smsBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("smsBroadcastReceiver", "onReceive");
            Bundle pudsBundle = intent.getExtras();
            Object[] pdus = (Object[]) pudsBundle.get(SMS_BUNDLE);
            SmsMessage messages = SmsMessage.createFromPdu((byte[]) pdus[0]);
            Log.i(TAG,  messages.getMessageBody());

            firebaseVerificationCode = messages.getMessageBody().trim().split(" ")[0];//only a number code 
            Toast.makeText(getContext(), firebaseVerificationCode,Toast.LENGTH_SHORT).show();
            String token = firebaseAutenticationService.getVerificationCode();//your service
        firebaseAutenticationService.verifyPhoneNumberWithCode(token,verificationCode);
        }
    };
}

答案 2 :(得分:0)

更新的代码

fun resendOTP(activity: Activity,mobileNo: String){
    val options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(mobileNo) // Phone number to verify
        .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
        .setActivity(activity) // Activity (for callback binding)
        .setCallbacks(callback) // OnVerificationStateChangedCallbacks
        .setForceResendingToken(resendToken!!) // ForceResendingToken from callbacks
        .build()
    PhoneAuthProvider.verifyPhoneNumber(options)
}

对于Java,请参见Github

感谢GGWP的链接。

答案 3 :(得分:0)

最终 FirebaseAuth _auth = FirebaseAuth.instance;

  void resendVerificationCode(String phoneNumber) async {
    print(widget.forceResendingToken);
    EasyLoading.show();
    await _auth.verifyPhoneNumber(
        phoneNumber: "+91" + phoneNumber,
        forceResendingToken: widget.forceResendingToken,
        timeout: const Duration(seconds: 120),
        verificationCompleted: (PhoneAuthCredential phoneAuthCredential) async {
          await _auth.signInWithCredential(phoneAuthCredential);
          EasyLoading.dismiss();
          showSnackbar(
              "Phone number automatically verified and user signed in: ${_auth.currentUser.uid}");
        },
        verificationFailed: (FirebaseAuthException authException) {
          EasyLoading.dismiss();
          showSnackbar(
              'Phone number verification failed. Code: ${authException.code}. Message: ${authException.message}');
        },
        codeSent: (String verificationId, [int forceResendingToken]) async {
          print("TESTED 1.D");
          EasyLoading.dismiss();
          showSnackbar('Please check your phone for the verification code.');
          widget._verificationId = verificationId;
        },
        codeAutoRetrievalTimeout: (String verificationId) {
          EasyLoading.dismiss();
          showSnackbar("verification code: " + verificationId);
          widget._verificationId = verificationId;
        });
  }

第一次发送短信时,您将获得 forceResendToken。只需将其保存到变量并在下次传递该变量即可。

// forceResendingToken: widget.forceResendingToken