/
m.makarov
/
FastAPI
Обзор
Документация
Войти
/
m.makarov
/
FastAPI
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
frontend/src/utils/tokenManager.js
77 строк
2 KB
Maks
Авторизация, стили для фронта
23 дек 2025, 13:58
23 дек 2025, 13:58
b808b1c
Код
Авторство
О чём код?
// src/utils/tokenManager.js import { apiJson as api } from '@/api/auth.js' // ✅ Исправлено let isRefreshing = false let failedQueue = [] const processQueue = (error, token = null) => { failedQueue.forEach(prom => { if (error) { prom.reject(error) } else { prom.resolve(token) } }) failedQueue = [] } export const refreshToken = async () => { const refreshToken = localStorage.getItem('refresh_token') if (!refreshToken) { throw new Error('No refresh token found') } try { const response = await api.post('/users/refresh_token', { refresh_token: refreshToken }) const newAccessToken = response.data.access_token localStorage.setItem('access_token', newAccessToken) return newAccessToken } catch (err) { localStorage.removeItem('access_token') localStorage.removeItem('refresh_token') window.location.href = '/login' throw err } } export const setupTokenInterceptor = () => { api.interceptors.response.use( response => response, async error => { const originalRequest = error.config if (error.response?.status === 401 && !originalRequest._retry) { if (isRefreshing) { return new Promise((resolve, reject) => { failedQueue.push({ resolve, reject }) }).then(token => { originalRequest.headers.Authorization = `Bearer ${token}` return api(originalRequest) }).catch(err => { return Promise.reject(err) }) } originalRequest._retry = true isRefreshing = true try { const newToken = await refreshToken() originalRequest.headers.Authorization = `Bearer ${newToken}` processQueue(null, newToken) return api(originalRequest) } catch (err) { processQueue(err) return Promise.reject(err) } finally { isRefreshing = false } } return Promise.reject(error) } ) }