@Sport-code

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

Всем привет!

Подскажите пожалуйста, как на клиенте определить время жизни токена (JWT-token и JWT-passport), если закончилось время, я его храню в localstorage?
У меня интернет магазин все товары загружаю во Vuex при загрузке сайта, т.е. к серверу обращаюсь один раз.
Я никак не могу сообразить как бы правильно проверить токен, если я не обращаюсь к серверу.
Если время закончилось, то его нужно удалить.
  • Вопрос задан
  • 263 просмотра
Пригласить эксперта
Ответы на вопрос 3
Kozack
@Kozack
WordPress guru
  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 — отправляешь сперва запрос на рефреш этого токена, а потом уже отправляешь сам запрос.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
MXP
от 120 000 до 140 000 руб.
Posh Space Москва
от 160 000 до 180 000 руб.
НПЦ «САПСАН» Москва
от 100 000 до 140 000 руб.
18 июн. 2019, в 15:04
3500 руб./за проект
18 июн. 2019, в 14:21
100 руб./за проект