аутентификация по телефону на базе react native firebase — очень странное поведение

#javascript #react-native #firebase-authentication #react-native-android #react-native-firebase

#javascript #firebase-аутентификация #react-native #react-native-firebase

Вопрос:

Я скопировал код для аутентификации по телефону из RNFB практически точно с их сайта … смотрите Код ниже (ссылка здесь).

Когда я запускаю код, используя функцию «Номера телефонов для тестирования», предоставляемую Firebase (т. Е. использую фиктивный номер телефона)….тогда он НЕ создает пользователя в FB при запуске signInWithPhoneNumber функции ….. и только после запуска confirmCode функции он создает пользователя в FB. Насколько я понимаю, предполагается, что так оно и должно работать.
ОДНАКО …. когда я запускаю MyPhoneAuthButton fn, используя свой собственный номер телефона (т.Е. «Настоящий» тест)…затем мне отправляется сообщение об авторизации по SMS, и пользователь немедленно создается в FB без необходимости запускать confirmCode fn. Почему он действует по-разному при тестировании и запуске в prod? Для какого процесса я должен кодировать? Любая помощь приветствуется

 const MyPhoneAuthButton = props => {
  const [objConfirm, setObjConfirm] = useState(null);
  const [code, setCode] = useState('');

  // Handle the button press
  const signInWithPhoneNumber = phoneNumber => {
    auth()
      .signInWithPhoneNumber(phoneNumber)
      .then(confirmResult => {
        setObjConfirm(confirmResult);
      })
      .catch(err => {
        console.log('Invalid Phone Number', err.message);
      });
  };

  const confirmCode = () => {
    objConfirm
      .confirm(code)
      .then(user => {
        console.log('User auth by phone OK', user);
      .catch(err => {
        console.log('Invalid code.', err.message);
      });
  };


  <MyButton
    onPress={() => {
      signInWithPhoneNumber(props.telNum);
    }}>
    Sign in With Phone Number
  </MyButton>

  const signInWithPhoneNumber = phoneNumber => {
    auth()
      .signInWithPhoneNumber(phoneNumber)
      .then(confirmResult => {
        console.log('User successfully authorized via telNum');
        setObjConfirm(confirmResult);
      })
      .catch(err => {
        Alert.alert('Invalid Phone Number', err.message);
        console.log('Invalid Phone Number', err.message);
      });
  };
  

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

1. можете ли вы связать URL-адрес, с которого вы взяли код? Я бы хотел кое-что перепроверить

2. Готово — добавлено в исходное сообщение. Единственное, что я изменил, это использовать .then() , а не async await ….. поскольку его использование async await не допускало catch ошибок

3. вы отображали кнопку подтверждения? Можете ли вы показать свою функцию рендеринга

4. Добавлено в исходное сообщение

5. Привет @jamesmurphy, вы нигде не вызываете функцию confirmCode.

Ответ №1:

Так и должно быть. Сначала вы должны пройти этап подтверждения, после чего у вас появится кнопка для подтверждения кода. Я реорганизовал его в соответствии с URL-адресом, который вы связали с firebase

 const MyPhoneAuthButton = props => {
  const [objConfirm, setObjConfirm] = useState(null);
  const [code, setCode] = useState('');

  // Handle the button press
  const signInWithPhoneNumber = phoneNumber => {
    auth()
      .signInWithPhoneNumber(phoneNumber)
      .then(confirmResult => {
        setObjConfirm(confirmResult);
      })
      .catch(err => {
        console.log('Invalid Phone Number', err.message);
      });
  };

  const confirmCode = () => {
    objConfirm
      .confirm(code)
      .then(user => {
        console.log('User auth by phone OK', user);
      .catch(err => {
        console.log('Invalid code.', err.message);
      });
  };
  
  const signInWithPhoneNumber = phoneNumber => {
    auth()
      .signInWithPhoneNumber(phoneNumber)
      .then(confirmResult => {
        console.log('User successfully authorized via telNum');
        setObjConfirm(confirmResult);
      })
      .catch(err => {
        Alert.alert('Invalid Phone Number', err.message);
        console.log('Invalid Phone Number', err.message);
      });
  };

  if(!objConfirm) {
    return (
      <MyButton
        onPress={() => {
          signInWithPhoneNumber(props.telNum);
        }}>
        Sign in With Phone Number
      </MyButton>  
    )
  }
  
  return (
    <>
      <TextInput value={code} onChangeText={text => setCode(text)} />
      <Button title="Confirm Code" onPress={() => confirmCode()} />
    </>
  );  

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

1. Этот ответ не имеет для меня никакого смысла …. пожалуйста, разъясните, как это решение? Похоже, что все, что вы сделали, это продублировали signInWithPhoneNumber функцию и удалили журнал консоли и предупреждение. Возможно, я что-то упустил??

2. Да, вы промахнулись. Есть 2 состояния, для которых должна появиться кнопка. Во-первых, он контролирует, если objConfirm, если он не подтвержден, он отображает кнопку для подписи, иначе, если он уже подтвержден, он отобразит textinput и кнопку, которая позволяет вводить код и отправлять. Я только что сравнил код, который вы написали, и код, который вы связали, и ответил кодированием недостающих частей.

3. Я написал код, который отображает разные кнопки в зависимости от типа ….. Я просто не вдавался в свой вопрос, поскольку не считал его актуальным / важным. Вопрос, на который я хочу получить ответ, заключается в том, почему поведение отличается, когда я использую действительное число вместо фиктивного