Методы входа с помощью аутентификации Firebase SMS

#android #firebase #firebase-authentication

# #Android #firebase #firebase-аутентификация

Вопрос:

У меня есть этот код Android для входа в Firebase с использованием кода SMS:

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

        FirebaseApp.initializeApp(this);

        userLoggedIn();
        
        mPhoneNumber = findViewById(R.id.phoneNumber);
        mCode = findViewById(R.id.code);
        mSend = findViewById(R.id.send);

        mAuth = FirebaseAuth.getInstance();

        mSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mVerificationId != null) {
                    // verifyPhoneNumberWithCode(mVerificationId, mCode.getText().toString());
                    verifyPhoneNumberWithCode(mVerificationId, mCode.getText().toString());
                } else {
                    startPhoneNumberVerification();
                }
            }
        });

        mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
                Log.d(TAG, "onVerificationCompleted:"   phoneAuthCredential);
                signInWithPhoneAuthCredentials(phoneAuthCredential);
            }

            @Override
            public void onVerificationFailed(@NonNull FirebaseException e) {

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

                mVerificationId = verificationId;
                mSend.setText("Verify Code");
            }

        };
    }

    private void verifyPhoneNumberWithCode(String verificationId, String code) {
        PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
        signInWithPhoneAuthCredentials(credential);;
    }

    private void startPhoneNumberVerification() {

        PhoneAuthOptions options =
                PhoneAuthOptions.newBuilder(mAuth)
                        .setPhoneNumber(mPhoneNumber.getText().toString())       // Phone number to verify
                        .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
                        .setActivity(this)                 // Activity (for callback binding)
                        .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
                        .build();

        PhoneAuthProvider.verifyPhoneNumber(options);
    }

    private void signInWithPhoneAuthCredentials(PhoneAuthCredential phoneAuthCredential) {

        FirebaseAuth.getInstance().signInWithCredential(phoneAuthCredential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if(task.isSuccessful()) {
                    userIsLoggedIn();
                }
            }
        });
    }

    private void userIsLoggedIn() {
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        if (user != null) {
            startActivity(new Intent(getApplicationContext(), MainPageActivity.class));
            finish();
            return;
        }
    }
 

Код работает нормально, НО после того, как я добавил следующие 2 метода входа в firebase project console, приложение больше не требует от новых пользователей проверки кода SMS-сообщения — это означает, что новые пользователи автоматически входят в систему после получения кода без ввода кода в приложении.

Консоль провайдеров входа с помощью аутентификации Firebase

Вход в Google Google автоматически настраивается в подключенных iOS и веб-приложениях. Чтобы настроить вход в Google для ваших приложений Android, вам необходимо добавить отпечаток пальца SHA1 для каждого приложения в настройках вашего проекта.

Электронная почта / пароль
Позволяют пользователям регистрироваться, используя свой адрес электронной почты и пароль. Наши SDK также обеспечивают проверку адреса электронной почты, восстановление пароля и примитивы изменения адреса электронной почты. Узнать больше

В моем проекте настроены как SHA-1, так и SHA-256.

Есть идеи, почему он автоматически регистрирует новых пользователей без проверки отправленного кода SMS?

Комментарии:

1. Как только пользователь входит в систему любым способом, он остается в системе до тех пор, пока вы явно не выйдете из нее.

2. кто сказал, что они вошли в систему??? a new user gets signed in automatically after getting the code without punching in the code on the app page

3. Firebase Auth автоматически регистрирует пользователей, которые ранее вошли в систему. Это может объяснить то, что вы наблюдаете. Не стесняйтесь игнорировать этот комментарий, если он бесполезен. Подумайте также о том, чтобы улучшить свой вопрос, более подробно объяснив, что работает не так, как вы ожидаете. Хорошо, что в вопросе достаточно информации, чтобы любой мог воспроизвести проблему от начала до конца.

4. Извините, но вы, очевидно, неправильно поняли мой вопрос. Я специально сказал, что новые пользователи и не проверены. Разве это не понятно из моего вопроса??

5. Не стесняйтесь улучшать свой вопрос, как я предложил. Это зависит от вас.

Ответ №1:

Возможно, с вашим номером телефона происходит мгновенная проверка. Я заметил, что с нашими номерами в большинстве случаев работает автоматическое извлечение.

Я предполагаю, что такое поведение может происходить в зависимости от поставщика услуг / кода страны / устройства или других факторов.

https://firebase.google.com/docs/auth/android/phone-auth#onverificationcompletedphoneauthcredential

 onVerificationCompleted(PhoneAuthCredential)
 

Этот метод вызывается в двух ситуациях:

Мгновенная проверка: в некоторых случаях номер телефона может быть мгновенно подтвержден без необходимости отправки или ввода кода подтверждения.

Автоматическое извлечение: на некоторых устройствах службы Google Play могут автоматически определять входящие подтверждающие SMS-сообщения и выполнять проверку без действий пользователя. (Эта возможность может быть недоступна для некоторых операторов.)

В любом случае номер телефона пользователя был успешно проверен, и вы можете использовать объект PhoneAuthCredential, который передается обратному вызову, для входа пользователя.