Реагирование зацикливания авторизации на собственный номер телефона - PullRequest
0 голосов
/ 24 апреля 2020

В последнее время я использовал модуль аутентификации 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>

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

клики выходят из системы => вывод на первый экран => кнопка входа нажимает сама => вошел в систему

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