Firebase OTP проверка onVerificationCompleted не вызвана

#android #kotlin #firebase-authentication #one-time-password

# #Android #kotlin #firebase-аутентификация #одноразовый пароль

Вопрос:

Я пытаюсь настроить проверку OTP, поэтому, когда пользователь вводит свой номер телефона, я отправляю им pin-код, onCodeSent() вызывается, и я получаю pin-код кода, но проблема в том, что при onVerificationCompleted() вызове я хотел бы перейти к другому действию, где пользователь может ввести PIN-код для проверкино он вообще не вызывается, и я не понимаю, почему. Любая помощь будет оценена, ребята, спасибо.

 val auth = PhoneAuthOptions
    .newBuilder(FirebaseAuth.getInstance())
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L,TimeUnit.MILLISECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(p0: PhoneAuthCredential) {
            // here i want to get the smscode and send it over the next activity to verify
            // but this method is not called at all 
                                
            Intent(this,ChangePasswordActivity::class.java).apply {
                putExtra("code",p0.smsCode)
                startActivity(this)
            }
        }

        override fun onVerificationFailed(p0: FirebaseException) {
            Timber.d("Firebase Exception ${p0.message}")
        }

        override fun onCodeSent(code: String, p1: PhoneAuthProvider.ForceResendingToken) {
            super.onCodeSent(code, p1)
        }

        override fun onCodeAutoRetrievalTimeOut(p0: String) {
            super.onCodeAutoRetrievalTimeOut(p0)
        }
    })
    .build()

PhoneAuthProvider.verifyPhoneNumber(auth)
 

Ответ №1:

onVerificationCompleted() будет вызываться только тогда, когда номер телефона был проверен без какого-либо ввода от пользователя. Чтобы сделать то, что вы пытаетесь, вместо этого вы должны отправить свое намерение внутрь onCodeSent() .

Вот примерный поток событий (которые подробно описаны в документации):

  1. Получить номер телефона от пользователя
  2. Вызовите PhoneAuthProvider.verifyPhoneNumber(auth) (как вы уже), чтобы отправить PIN-код пользователю
  3. onCodeSent() вызывается с идентификатором проверки и токеном повторной отправки.
  4. Внутри onCodeSent() создайте намерение запустить «экран ввода pin-кода» с идентификатором проверки.
  5. Получите PIN-код от пользователя, а затем объедините его с идентификатором проверки, вызвав PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, userInput)
  6. Используйте эти учетные данные для входа пользователя с помощью signInWithCredential(credential) .
 val auth = PhoneAuthOptions
    .newBuilder(FirebaseAuth.getInstance())
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L,TimeUnit.MILLISECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // if here, phone number was verified automatically
            mAuth.signInWithCredential(credential)
                 .addOnCompleteListener(/* ... */)
        }

        override fun onVerificationFailed(p0: FirebaseException) {
            Timber.d("Firebase Exception ${p0.message}")
        }

        override fun onCodeSent(verificationId: String, resendToken: PhoneAuthProvider.ForceResendingToken) {
            // if here, code was sent to phone number
            // open pin input screen
            Intent(this,ChangePasswordActivity::class.java).apply {
                putExtra("verificationId",verificationId)
                startActivity(this)
            }
        }

        // we aren't using onCodeAutoRetrievalTimeOut, so it's omitted.
    })
    .build()

PhoneAuthProvider.verifyPhoneNumber(auth)
 

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

1. Идея, которую я хотел реализовать, заключается в том, что я хочу сравнить оба pin-кода, поскольку я использую его не для входа пользователя, а для восстановления его пароля после получения pin-кода в его номере, в этом случае идентификатор проверки не совпадает с этим pin-кодом, я хочу, чтобы кто-нибудь получилтот же PIN-код, который был отправлен пользователю, и отправьте его в дополнительных целях и очень на другом экране, это люди или мой подход не очень хорош, спасибо?

2. Вам никогда не будет сообщен необработанный PIN-код, поскольку это противоречит цели аутентификации вне привязки. Вам будет предоставлен только идентификатор подтверждения, который вы отправляете с вводом пользователя. Вы также не можете «восстановить» пароль пользователя, только сбросить / изменить его — вы никогда не должны хранить пароль пользователя где угодно. Чтобы изменить пароль пользователя, вы должны иметь возможность войти в систему, используя учетные данные, указанные выше, а затем использовать updatePassword() , предполагая, что вы связали учетные записи.

3. давайте предположим, что пользователь забыл свой пароль и больше не может получить доступ к своей учетной записи, в этом случае OTP не стоит, и я должен скорее обратиться к проверке электронной почты, чтобы сбросить пароль, под восстановлением я также подразумевал сброс, это все еще возможно, спасибо?

4. Пожалуйста, ознакомьтесь с документацией по сбросу пароля пользователя .

5. Спасибо, что поделились ссылкой, поэтому, подводя итог, невозможно в основном сбросить пароль пользователя с помощью otp

Ответ №2:

Я также сталкивался с этой проблемой, но когда я добавил свой проект в облачную консоль Google, включил службы api (облачная консоль Google) и включил проверку телефона (облачная консоль Google), тогда onVerificationCompleted работает нормально. https://console.cloud.google.com/home

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

1. Какие API-интерфейсы вы включили, чтобы заставить его работать