Проверка Firebase OTP onVerificationCompleted не вызывается

Я пытаюсь настроить проверку OTP, поэтому, когда пользователь вводит свой номер телефона, я отправляю им пин-код, вызывается onCodeSent() и я получаю пин-код, но проблема в том, что когда вызывается 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)

person taki eddine    schedule 31.12.2020    source источник


Ответы (1)


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

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

  1. Получить номер телефона от пользователя
  2. Позвоните PhoneAuthProvider.verifyPhoneNumber(auth) (как вы уже сделали), чтобы отправить пин-код пользователю
  3. Вызывается onCodeSent() с идентификатором подтверждения и токеном повторной отправки.
  4. Внутри onCodeSent() создайте намерение запустить экран ввода PIN-кода с идентификатором подтверждения.
  5. Получите пин-код от пользователя, а затем объедините его с идентификатором подтверждения, позвонив 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)
person samthecodingman    schedule 31.12.2020
comment
Идея, которую я хотел реализовать, заключается в том, что я хочу сравнить оба пин-кода, поскольку я использую его не для входа в систему, а для восстановления его пароля после получения пин-кода в его номере, в этом случае идентификатор проверки не тот что касается этого пин-кода, я хочу, чтобы кто-то получил тот же пин-код, который был отправлен пользователю, и отправил его в дополнениях намерений и очень на другом экране, это люди или мой подход нехорошие, спасибо? - person taki eddine; 31.12.2020
comment
Вам никогда не сообщат необработанный PIN-код, так как это сводит на нет цель аутентификации вне границ. Вам будет предоставлен только идентификатор подтверждения, который вы отправите вместе с вводом пользователя. Вы также не можете восстановить пароль пользователя, только сбросьте / измените его - вы никогда не должны нигде хранить пароль пользователя. Чтобы изменить пароль пользователя, вы должны иметь возможность войти в систему, используя учетные данные, как указано выше, а затем использовать _ 1_ при условии, что вы связали аккаунты. - person samthecodingman; 01.01.2021
comment
давайте предположим, что пользователь забыл свой пароль и больше не может получить доступ к своей учетной записи, в этом случае OTP не стоит, и я должен скорее обратиться к проверке электронной почты, чтобы сбросить пароль, под восстановлением я также имел в виду сброс, это все еще возможно, спасибо ? - person taki eddine; 01.01.2021
comment
Прочтите документацию по сбросу пароля пользователя. - person samthecodingman; 02.01.2021
comment
Спасибо, что поделились ссылкой, поэтому, чтобы подвести итог, в основном невозможно сбросить пароль пользователя с помощью otp - person taki eddine; 03.01.2021