как оставаться в системе после обновления страницы в приложении React / Redux - PullRequest
0 голосов
/ 04 мая 2019

Я защищаю маршруты, используя избыточные состояния. То, что я делаю, это когда пользователь входит в систему, я обновляю избыточное состояние isAuthenticated в signIn компоненте и получаю это состояние в моем AllRoutes компоненте, а затем я передаю его по своему пользовательскому маршруту ProtectedHomeRoute в качестве подпорки. Все работает нормально, но проблема в том, что когда я обновляюсь, я получаю isAuthenticated значение false, которое является его значением по умолчанию, поэтому ProtectedHomeRoute перенаправляет меня на Login страницу.

Пожалуйста, предложите мне лучший способ обновления браузера в вышеупомянутом случае использования.

Я попытался решить эту проблему таким образом, что я выполнил новое действие с именем isLoggedIn, в этом я вызываю API для проверки состояния входа в систему, если в случае ответа я передаю значение true в полезной нагрузке

тогда я называю это действие в componentDidMount образ жизни AllRoutes так что когда браузер обновится, будет вызван isLoggedIn и я получу предыдущее состояние, но ничего не происходит, вот так.

Это код isLoggedIn действия

export function isLoggedIn() {
  axios.get("http://localhost:8080/api/checkLoginStatus").then(res => {
    let data = res.data; 
    let tid = data.data; // data contain userId
    console.log(tid);
    let isAuthenticate =  false
    if(tid){
      isAuthenticate = true;
    }  
    return dispatch => {
      dispatch({
        type: "isLoggedIn",
        payload: isAuthenticate
      });
    };
  })
}

Это код редуктора

    const INITIAL_STATE = {
    isAuthenticate: false
  };

  export default (states = INITIAL_STATE, action) => {
    switch (action.type) {
      case "loggedIn":
        return {
          ...states,
          isAuthenticate: action.payload
        };
      case "logOut":
        return {
          ...states,
          isAuthenticate: action.payload
        };
        case "isLoggedIn":
        return {
          ...states,
          isAuthenticate: action.payload
        };

      default:
        return states;
    }
  };

Код компонента AllRouts

import { isLoggedIn } from "./store/action/authAction";
import axios from 'axios';

class AllRoutes extends React.Component {

  componentDidMount() {
    isLoggedIn();
  }
  render() {
    console.log(this.props.isAuthenticate);

    return (
      <Router>        
        <Switch>
          <Route path="/auth/signup" component={Signup} />
          <Route path="/auth/signin" component={Signin} />
          <Route path="/auth/forgot" component={Forgot} />
          <Route exact path="/stock" component={Products} />
          <Route exact path="/stock/detail/:id" component={Manage} />
          <ProtectedHomeRoute
            exact
            path="/"
            component={<Home />}
            isAuthenticate={this.props.isAuthenticate}
          />
        </Switch>
      </Router>
    );
  }
}

// to access redux stats as props in this component
function mapStateToProps(state) {
  return {
    isAuthenticate: state.authReducer.isAuthenticate
  };
}

function mapDispatchToProps(dispatch) {
  return {
    userAuthenticate: a => {
      dispatch(isLoggedIn(a));
    }
  };
}

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(AllRoutes);

// protected route for Home component
const ProtectedHomeRoute = ({ component, isAuthenticate, ...rest }) => {
  console.log("protected route", isAuthenticate);
  return (
    <Route
      {...rest}
      render={props =>
        isAuthenticate ? component : <Redirect to="/auth/signin" />
      }
    />
  );
};

1 Ответ

1 голос
/ 04 мая 2019

Исходя из вашего кода, я предполагаю, что вы больше являетесь разработчиком внешнего интерфейса. Вы не должны использовать userId для аутентификации. Вы должны использовать что-то вроде jwt с истечением срока действия на вашем сервере. с помощью jwt вы можете создать токен для каждого вошедшего в систему пользователя. сохраняйте токен в LocalStorage и передавайте его как заголовок при каждом запросе, а ваш личный маршрут требует этот токен. Вы можете прочитать документацию jwt, и это должно дать вам представление о том, как это будет выглядеть:

Аутентичные действия аутентичные действия

Аутентификатор редуктора Аутентификатор редуктора

Частный маршрут Частный маршрут

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