Firebase Listener не работает во время входа в систему некоторых пользователей через проверку подлинности телефона - PullRequest
1 голос
/ 03 мая 2020

Обновление: проблема исчезла, когда все пользователи, столкнувшиеся с этой проблемой, сменили оператора мобильной связи. Проблема не возникла, когда они вернулись к первоначальному носителю. Хотя сейчас все работает, было бы полезно, если бы я определил причину ошибки, чтобы в будущем ее можно было правильно обработать

Пользователи в моем приложении входят в систему через проверку подлинности телефона Firebase. Раньше все работало нормально, поскольку некоторые пользователи, которые ранее входили в приложение, но впоследствии их данные были удалены, не могут войти в систему после sh. Процесс аутентификации и входа в систему перестали работать для этих пользователей. Сначала я предоставлю код, а затем подробно напишу, что я выяснил до сих пор. Я делаю тосты (не регистрирую, потому что эти пользователи являются удаленными), чтобы понять процесс.

Сначала я проверяю введенный номер телефона:

fun  verify(){
        verificationCallBacks()
        val mobile = "+91"+MobileNumber.text.toString()
        PhoneAuthProvider.getInstance().verifyPhoneNumber(
            mobile,
            60,
            TimeUnit.SECONDS,
            this,
            mCallbacks
        )
    }

fun verificationCallBacks(){

        mCallbacks = object: PhoneAuthProvider.OnVerificationStateChangedCallbacks(){
            override fun onVerificationCompleted(credential: PhoneAuthCredential) {
                Toast.makeText(this@Login, "Automatic", Toast.LENGTH_LONG).show()
                signIn(credential)
            }

            override fun onVerificationFailed(p0: FirebaseException) {

                Toast.makeText(this@Login, p0.toString(), Toast.LENGTH_SHORT).show()
            }

            override fun onCodeSent(p0: String, p1: PhoneAuthProvider.ForceResendingToken) {
                Toast.makeText(this@Login, "Verification ", Toast.LENGTH_LONG).show()

                super.onCodeSent(p0, p1)
                verificationID = p0
            }


        }
    }

После проверочных обратных вызовов, на В обычные дни некоторые пользователи автоматически входят в систему, а некоторые проходят проверку подлинности с помощью проверочного SMS. Код для входа в систему и аутентификации (вход в систему через SMS для проверки):

fun authenticate(){

        if(Verification.text.toString().trim().isNotEmpty()) {
            val verifyCode = Verification.text.toString()
            val credential: PhoneAuthCredential =
                PhoneAuthProvider.getCredential(verificationID, verifyCode)
            signIn(credential)
        }
    }

fun signIn(credential: PhoneAuthCredential){
        mAuth.signInWithCredential(credential)
            .addOnCompleteListener {
                    task: Task<AuthResult> ->
                if(task.isSuccessful){
                    saveUserToFirebaseDatabase()
                }else{
                    if (task.exception is FirebaseAuthInvalidCredentialsException) {
                        Toast.makeText(this@Login, "Error Logging you in", Toast.LENGTH_SHORT).show()
                    }
                }
            }

    }

После метода входа в систему пользователь сохраняется в базе данных, если он не существует, или он существует, тогда обновляется что-то еще следующим образом:

fun saveUserToFirebaseDatabase(){
        val uid = mAuth.uid ?: ""
        ref1 = newref.child(uid)
        Toast.makeText(this@Login, uid, Toast.LENGTH_LONG).show()

        listenerA1 = ref1.addValueEventListener(object : ValueEventListener{
            override fun onCancelled(p0: DatabaseError) {
                Toast.makeText(this@Login, p0.message, Toast.LENGTH_LONG).show()
            }

            override fun onDataChange(p0: DataSnapshot) {
                if(p0.exists()){

                  **** Do Something *****

                }else{
                   **** Do Something *****
                }
            }
        })
    }

Для пользователей, которых я описал ранее, я вижу, что для них аутентификация завершена, но они не могут подключиться к базе данных. Последовательность выполнения кода, которую я смог выяснить, выглядит следующим образом:

1) При обратном вызове проверки запускаются оба автоматических c входа (onVerificationCompleted) и проверочные SMS (onCodeSent). Я не уверен, так ли это.

2) Автомат c signIn напрямую переносит выполнение в функцию signIn.

3) В функции signIn генерируется uid , который отображается. Но после этого слушатель пожарной базы не присоединяется. Следовательно, пользователь не может подключиться к базе данных. Сообщение об ошибке p0.message не отображается при ошибке базы данных.

4) Тем временем пользователь также получает проверочный код. Он вводит то же самое, и выполнение снова приводит его к функции входа в систему. Но затем он получает сообщение «Ошибка входа в систему». Эта ошибка возникает из-за того, что Firebase генерирует недопустимое исключение, так как «отправленное SMS истекло»

В течение последних 48 часов я ломаю голову над головой, не в состоянии понять, почему это происходит. Может кто-нибудь, пожалуйста, помогите

1 Ответ

0 голосов
/ 08 мая 2020

Это может или не может ответить на ваш вопрос, но это то, что я узнал о Firebase Auth

Если вы используете в своем приложении нескольких поставщиков аутентификации, например, для Google + Phone, это отлично работает в первый раз, но когда вы перезагружаете приложение, говорите очистить данные приложения, затем попробуйте снова войти в систему с номером телефона, сначала он выдаст вам ошибку без каких-либо полезных сообщений или кода ошибки.
Чтобы устранить эту проблему, я удалил / удалил эту спецификацию c вручную из консоли Firebase, выполнив поиск номера телефона.
После удаления учетной записи я смог снова войти в систему с тем же номером телефона.
Вы можете попытаться удалить учетную запись номера телефона из консоли и посмотреть, решит ли она выпуск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...