| | |
| | | // Token 是否刷新中 |
| | | let isRefreshing = false; |
| | | |
| | | let reloginTask: Promise<boolean> | null = null; |
| | | |
| | | function dropToken() { |
| | | const { user } = useStore(); |
| | | user.token = ""; |
| | | storage.remove("token"); |
| | | storage.remove("token_deadtime"); |
| | | storage.remove("refreshToken"); |
| | | storage.remove("refreshToken_deadtime"); |
| | | } |
| | | |
| | | function recoverLogin() { |
| | | if (reloginTask) { |
| | | return reloginTask; |
| | | } |
| | | reloginTask = import("../mini-login") |
| | | .then(({ miniAutoLogin }) => { |
| | | dropToken(); |
| | | return miniAutoLogin(true); |
| | | }) |
| | | .catch(() => false) |
| | | .finally(() => { |
| | | reloginTask = null; |
| | | }); |
| | | return reloginTask; |
| | | } |
| | | |
| | | export default function request(options: any) { |
| | | const { user } = useStore(); |
| | | |
| | |
| | | message: string; |
| | | data: any; |
| | | }; |
| | | |
| | | const invalid = res.statusCode === 401 || message === "登录失效~"; |
| | | const skipRelogin = /miniAuto|refreshToken/.test(options.url || ""); |
| | | if (invalid && !skipRelogin && !options.__retried) { |
| | | options.__retried = true; |
| | | recoverLogin() |
| | | .then((ok) => { |
| | | if (!ok) { |
| | | reject({ message: message || "登录失效~", code: code || 1001 }); |
| | | return; |
| | | } |
| | | Authorization = useStore().user.token || ""; |
| | | next(); |
| | | }) |
| | | .catch((err) => reject(err)); |
| | | return; |
| | | } |
| | | |
| | | // 无权限 |
| | | if (res.statusCode === 401) { |
| | |
| | | // 判断 token 是否过期 |
| | | if (storage.isExpired("token")) { |
| | | // 判断 refreshToken 是否过期 |
| | | if (storage.isExpired("refreshToken")) { |
| | | // 退出登录 |
| | | return user.logout(); |
| | | if (!storage.get("refreshToken") || storage.isExpired("refreshToken")) { |
| | | recoverLogin() |
| | | .then((ok) => { |
| | | if (!ok) { |
| | | reject({ message: "登录失效~", code: 1001 }); |
| | | return; |
| | | } |
| | | Authorization = useStore().user.token || ""; |
| | | next(); |
| | | }) |
| | | .catch((err) => reject(err)); |
| | | return; |
| | | } |
| | | |
| | | // 是否在刷新中 |
| | |
| | | requests = []; |
| | | isRefreshing = false; |
| | | }) |
| | | .catch((err) => { |
| | | user.logout(); |
| | | reject(err); |
| | | .catch(() => { |
| | | isRefreshing = false; |
| | | requests = []; |
| | | recoverLogin() |
| | | .then((ok) => { |
| | | if (!ok) { |
| | | reject({ message: "登录失效~", code: 1001 }); |
| | | return; |
| | | } |
| | | Authorization = useStore().user.token || ""; |
| | | next(); |
| | | }) |
| | | .catch((err) => reject(err)); |
| | | }); |
| | | } |
| | | |