В последнее время я использовал модуль аутентификации firebase для проверки подлинности телефона и наткнулся на эту странную ошибку. Когда я пытаюсь выйти из приложения, позвонив по номеру auth().signout()
, пользователь отключается и снова автоматически входит в систему.
const FirstScreen = props => {
const context = useContext(AuthContext);
console.log(props);
const signOutUser = async () => {
try {
await auth().signOut();
// context.editState({isLoading: false});
console.log("Logged Out")
} catch (e) {
console.log(e);
// context.editState({isLoading: false});
}
}
useEffect(() => {
// context.editState({isLoading: true});
console.log(context.state)
signOutUser()
}, [])
const onTextChanged = (e,inputType) => {
(inputType) ? context.addPhNumber(e) : context.editState({callingCode : e})
}
return(
<React.Fragment>
<Text style={styles.swipeablePanelContentText}>Please enter your phone number</Text>
<View style={styles.swipeablePanelMobile}>
<TextInput style={styles.swipeablePanelMobileCode} keyboardType={"number-pad"} value={context.state.callingCode} maxLength={4} returnKeyType='done' onChangeText = {(e)=> onTextChanged(e,0)} onFocus={() => props.toggleKeypad()}></TextInput>
<TextInput style={styles.swipeablePanelMobileNo} keyboardType={"number-pad"} value={context.state.phNumber} maxLength={10} returnKeyType='done' onChangeText = {(e)=> onTextChanged(e,1)} onFocus={() => props.toggleKeypad()}></TextInput>
</View>
</React.Fragment>
);
}
Когда я исследовал это, я обнаружил, что auth().onAuthStateChanged
вызывается всякий раз, когда пользователь входит или выходит.
useEffect( () => {
auth().onAuthStateChanged( (user) => {
if (user) {
if (context.state.phNumber){
console.log(context.state.phNumber)
console.log(user);
context.editState({isLoading : true})
user.getIdTokenResult().then(
(idTokenResult) => {
if(idTokenResult.token){
context.editState({token : idTokenResult.token})
// post request for logging in
axios.post('https://myapp.com/logins', {
token : idTokenResult.token
}).then((response) => {
context.editState({isLoading : false})
onSignIn(response.data.payload.access).then(() => {
context.editState({signedIn: true})
props.navigation.navigate("App")
})
})
.catch((error) => {
context.editState({isLoading : false})
if(error.response.status == 404){
context.editState({screenNo: 2})
}
console.log(error.response)
})
}
else{
Alert.alert("Error","Oops! Something Unexpected Happened, please check your Network Connection")
context.editState({isLoading : false})
}
}
)
}
else{
Alert.alert("Error","Oops! check your phone number")
context.editState({isLoading : false})
}
}
else
{
// reset state if you need to
console.log("not yet")
context.editState({isLoading : false})
}
});
}, []);
, и поэтому я сделал кнопку для выхода таким образом, чтобы оно очищает существующее состояние приложения, но пользователь все равно сам проходит аутентификацию.
_signoutcheck = () => {
if(this.props.title == "Sign Out"){
onSignOut().then(() => {
// auth()
// .signOut()
// .then(() => {
this.context.editState({signedIn: false, screenNo: 0, token: "", phNumber: null})
this.props.navigation.navigate("Auth")
// }).catch(error => console.log(error))
})
}
<TouchableOpacity style={styles.contain} onPress={this._signoutcheck}>
<Text style={styles.containText}>{this.props.title}</Text>
</TouchableOpacity>
, но проблема сохраняется, и каждый раз, когда пользователь выходит из системы, он снова входит в систему.
клики выходят из системы => вывод на первый экран => кнопка входа нажимает сама => вошел в систему