web-dev-qa-db-ja.com

Firebase Phone Authentication AndroidでSMS検証を再送信するには?

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を使用してSMS確認コードを再送信することを強制できます。ただし、ドキュメントの調査を行った後、まだ方法がわかりません。

このtokenを使用してSMS検証?

12
Boonya Kitpitak

ソース: 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
}
21
GGWP

firebaseメソッドを使用して、たとえばPERSISTENCEとして検証コードを再送信し、たとえば進行ダイアログの実行中に自動でチェックインするためのsmsコードをインターセプトし、ユーザーに対して透過的にすることができます。

// [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,
            token);        // resending with token got at previous call's `callbacks` method `onCodeSent` 
    // [END start_phone_auth]
}

フラグメント内のブロードキャストレシーバーでSMSを確認します

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);
        }
    };
}
1
chry