From 95dedb6e2953009bba308dee4437bd6aa287bbe8 Mon Sep 17 00:00:00 2001 From: SunWuyuan Date: Sun, 2 Nov 2025 12:01:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=9B=9E=E8=B0=83=E5=A4=84=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=20Token=20=E5=88=B7=E6=96=B0=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/axios.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/lib/axios.js b/src/lib/axios.js index 86d2620..d9aa9a3 100644 --- a/src/lib/axios.js +++ b/src/lib/axios.js @@ -158,6 +158,8 @@ axiosInstance.interceptors.response.use( try { // 若没有刷新能力或没有刷新令牌,则直接走失败逻辑 if (!authHandlers?.refreshAccessToken || !authHandlers?.getRefreshToken || !authHandlers.getRefreshToken()) { + // 无法刷新,触发认证失败回调并退出 + try { authHandlers?.onAuthFailure && authHandlers.onAuthFailure(new Error('NO_REFRESH_TOKEN')) } catch {} throw new Error('NO_REFRESH_TOKEN') } @@ -180,11 +182,18 @@ axiosInstance.interceptors.response.use( // 由请求拦截器负责附加新 Authorization,无需手动改 headers return await axiosInstance.request(config) } catch (refreshErr) { - // 刷新失败,返回原始错误信息 + // 刷新失败,触发认证失败并返回原始错误信息 + try { authHandlers?.onAuthFailure && authHandlers.onAuthFailure(refreshErr) } catch {} return Promise.reject(new Error(message)) } } + // 明确的权限问题同样触发登出(例如服务端使用 403 表示 Token 无效或权限已失效) + if (status === 403) { + try { authHandlers?.onAuthFailure && authHandlers.onAuthFailure(new Error(message || 'FORBIDDEN')) } catch {} + return Promise.reject(new Error(message || 'FORBIDDEN')) + } + // 仅在后端提示设备不存在时尝试注册并重试,且保证只重试一次 if (!skip && !config.__retriedAfterRegistration && typeof backendMessage === 'string' && backendMessage.startsWith('设备不存在')) { // 从 headers / url / body 提取 uuid