#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, который передается обратному вызову, для входа пользователя.