#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. Я написал код, который отображает разные кнопки в зависимости от типа ….. Я просто не вдавался в свой вопрос, поскольку не считал его актуальным / важным. Вопрос, на который я хочу получить ответ, заключается в том, почему поведение отличается, когда я использую действительное число вместо фиктивного