Как отправить действие в немом компоненте PrivateRoute - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь завершить процесс аутентификации в моем приложении Reaction-Redux.Пока у меня есть следующий файл app.js:

const PrivateRoute = ({ component: Component, ...rest, isAuthenticated }) => (
    <Route {...rest} render={props =>
        isAuthenticated
            ? <Component {...props} />
            : <Redirect to={{
                pathname: '/login',
                state: { from: props.location }
            }} />
    } />    
)

const App = (props) => (
    <Layout>
        <Route exact path='/' component={Home} />
        <PrivateRoute path='/block1' component={Block} isAuthenticated={props.isAuthenticated} />
        <PrivateRoute path='/block2' component={Block} isAuthenticated={props.isAuthenticated} />
        <PrivateRoute path='/block3' component={Block} isAuthenticated={props.isAuthenticated} />
        <Route path='/login' component={LogIn} />
    </Layout>
)

const mapStateToProps = state => ({
    isAuthenticated: state.logIn.isAuthenticated
});

export default connect(mapStateToProps, null, null, {
    pure: false,
})(App);

Итак, когда пользователь не аутентифицирован, он переходит на страницу входа, проходит аутентификацию и перенаправляется на нужную страницу.Это хорошо работает, если у пользователя есть свой аккаунт без ограничения времени.Но в моем приложении каждый пользователь должен иметь дату истечения срока действия учетной записи.Если его срок действия истек меньше, чем сегодня, ему не следует разрешать доступ к защищенным страницам.

Предположим, у меня есть следующие данные пользователей в appsettings.json:

"Users": [
    {
      "username": "demo",
      "password": "AQAAAAEAACcQAAAAEOC26OrX6idwD+trnZ38fitcAWpRAM5wnfqo3KlVpi1Tn4JWArqJ6bCLyVRbiPDsWA==",
      "expired": "2018-10-01"
    }
  ]

Если пользователь успешно вошел в систему до 1 октября 2018 года и не закрыл страницу в своембраузер, он мог получить доступ к защищенным страницам после 1 октября 2018 года, потому что isAuthenticated верно.Так не должно быть.

Как мне правильно обращаться с этим делом?

Я вижу два возможных решения.

  1. Добавьте опцию loginDate и установите для нее значение в редукторе входа в систему, если пользователь входил в систему. Затем в компоненте PrivateRoute сравните loginDate с сегодняшней датой, а если разница превышает 1 день, перенаправьте пользователяна страницу входа.Но я чувствую, что это не самый лучший способ заставить его работать.
  2. После того, как пользователь успешно вошел в систему, выдайте токен JWT.Добавьте Auth reducer, который проверяет, прошел ли пользователь аутентификацию, отправив запрос на контроллер с заголовком, содержащим токен JWT.Я уже сделал эту часть.Но как я могу отправить это действие в PrivateRoute, чтобы получить isAuthenticated значение пропуска от редуктора аутентификации?

1 Ответ

0 голосов
/ 07 октября 2018

Так что, похоже, вам нужно отправить действие в определенное время.Или после определенного времени.

Когда вы входите в систему, вы можете запустить тайм-аут, который отправит действие ('LOGOUT' или то, что вы используете - это в конечном итоге обновит isAuthenticated хранилище).С дополнительной проверкой истечения срока действия токена.Если токен еще не истек (потому что он был обновлен), просто инициализируйте новый тайм-аут и все.

...