116 lines
3.2 KiB
TypeScript
116 lines
3.2 KiB
TypeScript
import { ExtServer, ExtServerApi } from "@App/app/const";
|
|
import { WarpTokenError } from "./error";
|
|
|
|
type NetDiskType = "baidu" | "onedrive";
|
|
|
|
export function GetNetDiskToken(netDiskType: NetDiskType): Promise<{
|
|
code: number;
|
|
msg: string;
|
|
data: { token: { access_token: string; refresh_token: string } };
|
|
}> {
|
|
return fetch(ExtServerApi + `auth/net-disk/token?netDiskType=${netDiskType}`)
|
|
.then((resp) => resp.json())
|
|
.then((resp) => {
|
|
return resp.data;
|
|
});
|
|
}
|
|
|
|
export function RefreshToken(
|
|
netDiskType: NetDiskType,
|
|
refreshToken: string
|
|
): Promise<{
|
|
code: number;
|
|
msg: string;
|
|
data: { token: { access_token: string; refresh_token: string } };
|
|
}> {
|
|
return fetch(ExtServerApi + `auth/net-disk/token/refresh?netDiskType=${netDiskType}`, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({
|
|
netDiskType,
|
|
refreshToken,
|
|
}),
|
|
})
|
|
.then((resp) => resp.json())
|
|
.then((resp) => {
|
|
return resp.data;
|
|
});
|
|
}
|
|
|
|
export function NetDisk(netDiskType: NetDiskType) {
|
|
return new Promise<void>((resolve) => {
|
|
const loginWindow = window.open(`${ExtServer}api/v1/auth/net-disk?netDiskType=${netDiskType}`);
|
|
const t = setInterval(() => {
|
|
try {
|
|
if (loginWindow!.closed) {
|
|
clearInterval(t);
|
|
resolve();
|
|
}
|
|
} catch (e) {
|
|
clearInterval(t);
|
|
resolve();
|
|
}
|
|
}, 1000);
|
|
});
|
|
}
|
|
|
|
export type Token = {
|
|
accessToken: string;
|
|
refreshToken: string;
|
|
createtime: number;
|
|
};
|
|
|
|
export async function AuthVerify(netDiskType: NetDiskType, invalid?: boolean) {
|
|
let token: Token | undefined;
|
|
try {
|
|
token = JSON.parse(localStorage[`netdisk:token:${netDiskType}`]);
|
|
} catch (e) {
|
|
// ignore
|
|
}
|
|
// token不存在,或者没有accessToken,重新获取
|
|
if (!token || !token.accessToken) {
|
|
// 强制重新获取token
|
|
await NetDisk(netDiskType);
|
|
const resp = await GetNetDiskToken(netDiskType);
|
|
if (resp.code !== 0) {
|
|
return Promise.reject(new WarpTokenError(new Error(resp.msg)));
|
|
}
|
|
token = {
|
|
accessToken: resp.data.token.access_token,
|
|
refreshToken: resp.data.token.refresh_token,
|
|
createtime: Date.now(),
|
|
};
|
|
invalid = false;
|
|
localStorage[`netdisk:token:${netDiskType}`] = JSON.stringify(token);
|
|
}
|
|
// token过期或者失效
|
|
if (Date.now() >= token.createtime + 3600000 || invalid) {
|
|
// 大于一小时刷新token
|
|
try {
|
|
const resp = await RefreshToken(netDiskType, token.refreshToken);
|
|
if (resp.code !== 0) {
|
|
localStorage.removeItem(`netdisk:token:${netDiskType}`);
|
|
// 刷新失败,并且标记失效,尝试重新获取token
|
|
if (invalid) {
|
|
return AuthVerify(netDiskType);
|
|
}
|
|
return Promise.reject(new WarpTokenError(new Error(resp.msg)));
|
|
}
|
|
token = {
|
|
accessToken: resp.data.token.access_token,
|
|
refreshToken: resp.data.token.refresh_token,
|
|
createtime: Date.now(),
|
|
};
|
|
localStorage[`netdisk:token:${netDiskType}`] = JSON.stringify(token);
|
|
} catch (e) {
|
|
// 报错返回原token
|
|
return Promise.resolve(token.accessToken);
|
|
}
|
|
} else {
|
|
return Promise.resolve(token.accessToken);
|
|
}
|
|
return Promise.resolve(token.accessToken);
|
|
}
|