Firebase OnAuthStateChanged для Phone Auth срабатывает даже для iOS - PullRequest
0 голосов
/ 25 октября 2018

В настоящее время я занимаюсь разработкой мобильного приложения, в котором Firebase использует службу OTP для Android и iOS. Также необходимо упомянуть, что я использую реагировать нативно с избыточным кодом.

Фон проблемы

Я использую библиотеку react-native-firebase для функций Firebase.Как говорится в документах, для Android мы можем использовать OnAuthStateChanged, чтобы определить, что пользователь вошел в систему с помощью сервисов Google.Но для iOS это сделать невозможно.

Проблема

Но для меня всякий раз, когда я выполняю вход с помощью телефона OTP, он автоматически регистрируется даже приустройство iOS.Так что это проблема.

Что я сделал

Ниже приведена часть кода для входа в систему с помощью телефона.

firebase.auth().signInWithPhoneNumber(phoneNumber).then(confirmResult =>{
    firebase.auth().onAuthStateChanged((user) => {
          if (user) {
                console.log('Auto signed in')
              })
        }
   })
}).catch(error => {console.log(error)})

Итак, используяconsole.log, я проверил, действительно ли это работает на iOS.И когда я набираю свой номер телефона и вхожу, я автоматически захожу в систему с сообщением Auto Signed in в консоли отладчика.Так что на самом деле это работает с iOS.Также надо упомянуть выше часть кода, внутри редукционного действия.Все рассылки (Redux Thunk) происходит, если пользователь проверен.

Тогда мне нужно было проверить, что это работает, только когда я получаю OTP.Но даже когда я набираю случайный номер телефона (который не используется текущим мобильным телефоном), пользователь входит в систему даже без получения OTP.

Реальная проблема

Это OnAuthStateChange срабатывает даже без получения пользователем OTP SMS.Что является огромной проблемой.Что я тут делаю не так?Как решить эту проблему?

1 Ответ

0 голосов
/ 25 октября 2018

Я столкнулся с аналогичной проблемой с функцией onAuthStageChanged.Однако, я думаю, это происходит потому, что вы звоните onAuthStageChanged изнутри signInWithPhoneNumber.

Всякий раз, когда вы успешно входите по указанному номеру телефона, вызывается функция onAuthStageChanged.Однако, честно говоря, у меня нет хорошего объяснения того, как это исполнение происходит внутри if(user).В любом случае, я предполагаю, что из-за того, что вы уже выполнили вход с предыдущими попытками проверить приложение.

Таким образом, даже если пользователь никогда не входил в систему, функция успешного входа в систему запускается из-за вызова функции onAuthStageChanged.Вы можете проверить это, используя приведенный ниже фрагмент кода.(Я не совсем знаком с thunk btw)

export const sampleFunc = () =>{
    firebase.auth().onAuthStateChanged((user) => {
          if (user) {
            console.log('User signed in with just action call')
          })
        }
    })
     return(dispatch)=>{
       // Required dispatches.
    }
}

Так что, вызывая вышеупомянутую функцию из вашего класса, вы увидите User signed in with just action call в консоли даже без каких-либо изменений этапа авторизации.

Потому чтоиз этого я просто вызываю onAuthStateChanged функцию из ComponentDidMount в вашем классе.Таким образом, очевидно, что пользователь не подписан, когда компонент монтируется.Затем из if(user) вызовите необходимые действия, чтобы сохранить данные и перейти к начальному экрану после успешного входа.

Итак, теперь, когда вы получаете сообщение,

iOS

onAuthStateChanged не сработает, как говорит Firebase.Поэтому iOS должна следовать основному экрану ввода OTP и подтвердить его оттуда.

Android

Используя Сервисы Google Play, она автоматически распознает входящее сообщение и выполнит необходимые задачи для запуска.onAuthStateChanged функция.Тогда, поскольку ComponentDidMount уже инициализировал onAuthStateChanged, это сработает и автоматически войдет в систему.

...