From 23ec39daad5c06371639924da7ac64a45b1ccd30 Mon Sep 17 00:00:00 2001 From: vasya Date: Sat, 21 Mar 2026 20:58:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D1=8E=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82,=20=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D0=BE=D0=BC=20=D1=80=D0=B5=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=20axios=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D1=80=D1=86=D0=B5=D0=BF=D1=82=D0=BE=D1=80=20?= =?UTF-8?q?(=D0=BF=D0=BE=D1=81=D1=80=D0=B5=D0=B4=D0=BD=D0=B8=D0=BA)=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20api=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=BE=D0=B2,=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=D1=8B=D1=85=20=D1=81=20=D1=84=D1=80=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D0=B0.=20=D0=9F=D0=BE=D0=B4=D1=80=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D0=B5=D0=B5=20=D0=B2=20=D1=81=D0=B0=D0=BC=D0=BE=D0=BC=20?= =?UTF-8?q?=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=B5,=20=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B0=D0=BA=D0=B6=D0=B5=20=D1=8F=20=D0=B2=D1=80=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=84=D0=BB=D1=8E=D0=B5?= =?UTF-8?q?=D0=BD=D1=81=20=D0=BE=D0=BF=D0=B8=D1=81=D1=8B=D0=B2=D0=B0=D0=BB?= =?UTF-8?q?=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/js/api.js | 81 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 resources/js/api.js diff --git a/resources/js/api.js b/resources/js/api.js new file mode 100644 index 0000000..616707f --- /dev/null +++ b/resources/js/api.js @@ -0,0 +1,81 @@ +import axios from 'axios'; + +/** + * @author dgavrilov + * Пока в этом скрипте реализован axios иaнтерцептор для api запросов, отправляемых с фронта. Своего рода посредник для совершения "пред" и "пост" действий/проверок во время отправки api запроса + */ + +//ГАВРИЛОВ +//переименуй файл на axios + +//Инстанс api контура +const api = axios.create({ + baseURL: '/public/api/', + withCredentials: true, + headers: { + 'content-type': 'application/json', + 'Accept': 'application/json', + } +}) + +//Инстанс web контура +const web = axios.create({ + baseURL: '/public/', + withCredentials: true, + headers: { + 'content-type': 'application/json', + 'Accept': 'application/json', + } +}) + +//Гаврилов. +//Перехват запросов. Добавить подстановку bearer token? +// api.interceptors.request.use(); + +let isRefreshing = false, //Флаг выполнения запроса на обновления токена. Пока он иеет значение true, остальные запросы, попадающие в очередь из за полученной 401 ошибки кладутся в массив queueRqsts + queueRqsts = []; //запросы, которые получили 401 ошибку, одновремменно кладутся в эту переменную в виде промимсов, чтобы быть вызванными позднее, когда будет результат обновления токена превого запроса +//Если api ответ возвращает 401 ошибку, отправляем web запрос на роут фонового обновления санктум токена, где происходит проверка сессии, срока жизни санктум токена и его обновление, при удовлетворяющих условиях + +//Перехват ответов api +api.interceptors.response.use( + response => response, + async error => { + const originalRequest = error.config; //Параметры вызываемого запроса + // originalRequest._retry = true; + if (error.response?.status === 401) { + if (isRefreshing) { + return new Promise((resolve, reject) => { + queueRqsts.push({ + resolve: () => resolve(api(originalRequest)), + reject + }) + }) + } else { + isRefreshing = true; + try { + let resultRefresh; + //ГАВРИЛОВ. запись данных формы в session storage при неудачном silent regresh token. Чтобы после перезагрузки страницы подтянуть данные из session storage в форму? тогда придется заморачиваться с компонентом подтягивания данных из session storage при рендеринге страницы + resultRefresh = await web.get('silent_token_refresh') + if (!resultRefresh.data.original.data.token_refresh) { + throw new Error('Сессия истекла'); + } + queueRqsts.forEach(pending => { + pending.resolve(); + }) + return api(originalRequest); + } catch (error) { + queueRqsts.forEach(pending => pending.reject(error)) + isRefreshing = false; + queueRqsts = []; + window.location.href = '/public/login'; + } finally { + isRefreshing = false; + queueRqsts = []; + } + } + } + return true; + } +) + +export default api;