#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()
.
Вот примерный поток событий (которые подробно описаны в документации):
- Получить номер телефона от пользователя
- Вызовите
PhoneAuthProvider.verifyPhoneNumber(auth)
(как вы уже), чтобы отправить PIN-код пользователю onCodeSent()
вызывается с идентификатором проверки и токеном повторной отправки.- Внутри
onCodeSent()
создайте намерение запустить «экран ввода pin-кода» с идентификатором проверки. - Получите PIN-код от пользователя, а затем объедините его с идентификатором проверки, вызвав
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, userInput)
- Используйте эти учетные данные для входа пользователя с помощью
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-интерфейсы вы включили, чтобы заставить его работать