Ну тогда только исключать параллельные запросы.
Соединять их в цепочку помисов (как писал ksa) |
Цитата:
|
здесь есть несколько интересных моментов
1. в теле токена есть дата когда он протухнет. незачем дергать сервак с заранее протухшим токеном. (Лень фронтэндщика :lol: ) 2. вопрос это по поводу токенов. Типичная работа с токенами jwt подразумевает возможность иметь множество валидных токенов(Токены не хранятся в базе!!! ). Разные клиенты, браузеры ... В данном случае шансы зацикливания минимальны. 3. Всегда можно реализовать очередь, очередь с приоритетами или выбрать другое пдходящее решение Что до ТС, самый лучший код - отсутствие кода. Когда я смотрю на ваш код, думаю, зачем вы его пишите. Может вам платят за кол-во |
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Пришло "просрочен" - отправляем рефреш. Пришло "не верный" - выбрасываем. А если после каждого "не верный" отправлять рефреш - то по какому индикаторы стоит прекратить его отправлять?)) |
Цитата:
Создали в сторе свойство (bool), которое переключалось в true после того, как какой-то компонент приложения посылал рефреш. Остальные компоненты, во время запроса проверяли это свойство и, если оно true - ждали изменение в false, затем получани токен (через rootState, из модуля с токеном, в котором уже обновились ключи) и продолжали запрос. Покопаюсь в коммитах и постараюсь выложить код из той ветки :write: Самый простой вариант, как я понимаю - это просто убрать у экшенов async?)) Но вот совсем не хочется загружать компоненты в приложении синхронно... |
Цитата:
.catch(async e => { if (e.response.status === 401 && checkExp(this.refreshToken) && await this.refresh()) { return this[method](path, params) } else { console.log(e) return location.href = '/login' } }) и токены лучше проверять const parse = token => { const base64Url = token.split('.')[1]; const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); return JSON.parse(decodeURIComponent(atob(base64).split('') .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''))); } const check = (token, type)=> { try { const data = parse(token) return (new Date(data[type] * 1000)) > (new Date()) } catch (_) { return false; } } export default { checkExp(token) { return check(token, 'exp') }, checkIat(token) { return check(token, 'iat') } } |
Цитата:
Ну и повторите запрос2 уже с новым токеном, а не выбрасывайте. Дождитесь окончания рефреша (через промис) и повторите. Цитата:
|
Часовой пояс GMT +3, время: 12:14. |