@Sport-code

Как на клиенте определить время жизни токена JWT?

Всем привет!

Подскажите пожалуйста, как на клиенте определить время жизни токена (JWT-token и JWT-passport), если закончилось время, я его храню в localstorage?
У меня интернет магазин все товары загружаю во Vuex при загрузке сайта, т.е. к серверу обращаюсь один раз.
Я никак не могу сообразить как бы правильно проверить токен, если я не обращаюсь к серверу.
Если время закончилось, то его нужно удалить.
  • Вопрос задан
  • 6344 просмотра
Пригласить эксперта
Ответы на вопрос 3
Kozack
@Kozack Куратор тега Vue.js
Thinking about a11y
  1. Вместе с токеном должено возвращаться время жизни токена.
  2. Если такого нет, то в момент получения токена стоит сохранять время его создания и срок жизни.
  3. Если срок жизни вам не известен, и сервер не предоставляет никакого инструмента для проверки токена, тогда вам стоит написать обёртку вогруг сетевого интерфейса: после обращения к АПИ, если сервер возвращает ошибку токен — получить новый и повторить запрос.
Ответ написан
@kirill-93
У вас есть время жизни токена, его и проверяйте в router.beforeEach. Больше ничего не надо.
Alex Александр Дроздов О чем вы говорите?
Если на клиенте злоумышленник изменит поле с временем жизни токена, токен от этого не станет "жить" дольше и на сервере все равно не пройдет и запрос отклонится.
Пинговать сервер в добавок к тому, что у вас на руках время жизни токена - это дикость какая-то.
Ответ написан
@deliro
Время жизни на клиенте самого токена проверять не надо:
1. JWT может быть httpOnly, иначе это прямой удар по безопасности в виде возможности сXSSить этот токен скриптами
2. У пользователя на ПК время может отличаться от серверного. Допустим, время жизни JWT — 5 минут, а у пользователя часы спешат на 6 минут. Этой разницы недостаточно, чтобы SSL не установилось, зато достаточно, чтобы твой скрипт навсегда зациклился в попытке получить "свежий" токен, думая, что он несвежий

Поэтому делаешь так:
После успешного получения JWT ставишь в localStorage текущее время пользователя (пренебрегая разницей между действительным временем истечения и временем исполнения твоей функции — оно скорее всего не будет превышать пинг пользователя + 100мс). Каждый запрос прерываешь с помощью какого-нибудь https://github.com/axios/axios#interceptors В этом "прерывателе" смотришь в localStorage и если прошло 50-80% (тут оставляем запас, потому что мы выше пренебрегли разницей + сам запрос может длится некоторое время [например, это могут быть сетевые задержки, или запрос будет лежать в очереди, пока воркеры заняты или какие-то запросы бэкенда в БД будут происходить до валидации JWT] + часы пользователя могут идти быстрее серверных и дать лишние пару микросекунд) времени жизни JWT — отправляешь сперва запрос на рефреш этого токена, а потом уже отправляешь сам запрос.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы