feat: 新增 JWT 刷新模式,支持因访问令牌过期而失败的请求重试

This commit is contained in:
ray
2024-11-14 18:32:23 +08:00
parent 0902e2320f
commit ad9dd5e1d1
5 changed files with 127 additions and 54 deletions

View File

@@ -5,7 +5,7 @@ import { useDictStoreHook } from "@/store/modules/dict";
import AuthAPI, { type LoginData } from "@/api/auth";
import UserAPI, { type UserInfo } from "@/api/system/user";
import { setToken, clearToken } from "@/utils/auth";
import { setToken, setRefreshToken, getRefreshToken, clearToken } from "@/utils/auth";
export const useUserStore = defineStore("user", () => {
const userInfo = useStorage<UserInfo>("userInfo", {} as UserInfo);
@@ -20,8 +20,9 @@ export const useUserStore = defineStore("user", () => {
return new Promise<void>((resolve, reject) => {
AuthAPI.login(loginData)
.then((data) => {
const { tokenType, accessToken } = data;
const { tokenType, accessToken, refreshToken } = data;
setToken(tokenType + " " + accessToken); // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxx
setRefreshToken(refreshToken);
resolve();
})
.catch((error) => {
@@ -69,7 +70,27 @@ export const useUserStore = defineStore("user", () => {
}
/**
* 清理用户会话
* 刷新 token
*/
function refreshToken() {
const refreshToken = getRefreshToken();
return new Promise<void>((resolve, reject) => {
AuthAPI.refreshToken(refreshToken)
.then((data) => {
const { tokenType, accessToken, refreshToken } = data;
setToken(tokenType + " " + accessToken);
setRefreshToken(refreshToken);
resolve();
})
.catch((error) => {
console.log(" refreshToken 刷新失败", error);
reject(error);
});
});
}
/**
* 清理用户数据
*
* @returns
*/
@@ -88,6 +109,7 @@ export const useUserStore = defineStore("user", () => {
login,
logout,
clearUserData,
refreshToken,
};
});