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