解决登录token的bug,移除refreshtoken
This commit is contained in:
@@ -12,11 +12,6 @@ export default {
|
|||||||
return await request.post('auth/logout')
|
return await request.post('auth/logout')
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
refresh: {
|
|
||||||
post: async function () {
|
|
||||||
return await request.post('auth/refresh')
|
|
||||||
},
|
|
||||||
},
|
|
||||||
me: {
|
me: {
|
||||||
get: async function () {
|
get: async function () {
|
||||||
return await request.get('auth/me')
|
return await request.get('auth/me')
|
||||||
|
|||||||
@@ -4,11 +4,10 @@ import { resetRouter } from '../../router'
|
|||||||
import { customStorage } from '../persist'
|
import { customStorage } from '../persist'
|
||||||
import userRoutes from '@/config/routes'
|
import userRoutes from '@/config/routes'
|
||||||
|
|
||||||
export const useUserStore = defineStore(
|
export const useUserStore = defineStore(
|
||||||
'user',
|
'user',
|
||||||
() => {
|
() => {
|
||||||
const token = ref('')
|
const token = ref('')
|
||||||
const refreshToken = ref('')
|
|
||||||
const userInfo = ref(null)
|
const userInfo = ref(null)
|
||||||
const menu = ref([])
|
const menu = ref([])
|
||||||
const permissions = ref([])
|
const permissions = ref([])
|
||||||
@@ -18,11 +17,6 @@ export const useUserStore = defineStore(
|
|||||||
token.value = newToken
|
token.value = newToken
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置 refresh token
|
|
||||||
function setRefreshToken(newRefreshToken) {
|
|
||||||
refreshToken.value = newRefreshToken
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置用户信息
|
// 设置用户信息
|
||||||
function setUserInfo(info) {
|
function setUserInfo(info) {
|
||||||
userInfo.value = info
|
userInfo.value = info
|
||||||
@@ -79,7 +73,6 @@ export const useUserStore = defineStore(
|
|||||||
// 登出
|
// 登出
|
||||||
function logout() {
|
function logout() {
|
||||||
token.value = ''
|
token.value = ''
|
||||||
refreshToken.value = ''
|
|
||||||
userInfo.value = null
|
userInfo.value = null
|
||||||
menu.value = []
|
menu.value = []
|
||||||
|
|
||||||
@@ -94,11 +87,9 @@ export const useUserStore = defineStore(
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
token,
|
token,
|
||||||
refreshToken,
|
|
||||||
userInfo,
|
userInfo,
|
||||||
menu,
|
menu,
|
||||||
setToken,
|
setToken,
|
||||||
setRefreshToken,
|
|
||||||
setUserInfo,
|
setUserInfo,
|
||||||
setMenu,
|
setMenu,
|
||||||
getMenu,
|
getMenu,
|
||||||
@@ -112,7 +103,7 @@ export const useUserStore = defineStore(
|
|||||||
persist: {
|
persist: {
|
||||||
key: 'user-store',
|
key: 'user-store',
|
||||||
storage: customStorage,
|
storage: customStorage,
|
||||||
pick: ['token', 'refreshToken', 'userInfo', 'menu']
|
pick: ['token', 'userInfo', 'menu']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,11 +9,6 @@ const request = axios.create({
|
|||||||
baseURL: config.API_URL,
|
baseURL: config.API_URL,
|
||||||
});
|
});
|
||||||
|
|
||||||
// 是否正在刷新 token
|
|
||||||
let isRefreshing = false;
|
|
||||||
// 存储待重试的请求
|
|
||||||
let requests = [];
|
|
||||||
|
|
||||||
// 请求拦截器
|
// 请求拦截器
|
||||||
request.interceptors.request.use(
|
request.interceptors.request.use(
|
||||||
(config) => {
|
(config) => {
|
||||||
@@ -62,45 +57,11 @@ request.interceptors.response.use(
|
|||||||
|
|
||||||
// 401 未授权 - token 过期或无效
|
// 401 未授权 - token 过期或无效
|
||||||
if (status === 401) {
|
if (status === 401) {
|
||||||
// 如果正在刷新 token,将请求加入队列
|
// 直接登出并跳转到登录页
|
||||||
if (isRefreshing) {
|
userStore.logout();
|
||||||
return new Promise((resolve) => {
|
router.push("/login");
|
||||||
requests.push((token) => {
|
message.error("登录已过期,请重新登录");
|
||||||
// 重新设置请求头
|
return Promise.reject(error);
|
||||||
error.config.headers["Authorization"] =
|
|
||||||
`Bearer ${token}`;
|
|
||||||
resolve(http(error.config));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 标记正在刷新
|
|
||||||
isRefreshing = true;
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 尝试刷新 token
|
|
||||||
const newToken = await refreshToken();
|
|
||||||
|
|
||||||
// 刷新成功,更新 token
|
|
||||||
userStore.setToken(newToken);
|
|
||||||
|
|
||||||
// 执行队列中的所有请求
|
|
||||||
requests.forEach((callback) => callback(newToken));
|
|
||||||
requests = [];
|
|
||||||
|
|
||||||
// 重新执行当前请求
|
|
||||||
error.config.headers["Authorization"] = `Bearer ${newToken}`;
|
|
||||||
return request(error.config);
|
|
||||||
} catch (refreshError) {
|
|
||||||
// 刷新失败,清空队列并跳转登录页
|
|
||||||
requests = [];
|
|
||||||
userStore.logout();
|
|
||||||
router.push("/login");
|
|
||||||
message.error("登录已过期,请重新登录");
|
|
||||||
return Promise.reject(refreshError);
|
|
||||||
} finally {
|
|
||||||
isRefreshing = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 403 禁止访问
|
// 403 禁止访问
|
||||||
@@ -128,13 +89,4 @@ request.interceptors.response.use(
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
// 刷新 token 的方法
|
|
||||||
async function refreshToken() {
|
|
||||||
// 刷新接口需要携带当前token在请求头中
|
|
||||||
const response = await request.post('auth/refresh');
|
|
||||||
|
|
||||||
// 返回格式为 { code, data: { token } }
|
|
||||||
return response.data.token;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default request;
|
export default request;
|
||||||
|
|||||||
Reference in New Issue
Block a user