This commit is contained in:
2025-04-16 14:01:26 +08:00
parent 071e728f06
commit 1a531dfad5
11 changed files with 259 additions and 35 deletions

View File

@ -1,5 +1,6 @@
import { ExtServer, ExtServerApi } from "@App/app/const";
import { WarpTokenError } from "./error";
import { LocalStorageDAO } from "@App/app/repo/localStorage";
type NetDiskType = "baidu" | "onedrive";
@ -8,11 +9,7 @@ export function GetNetDiskToken(netDiskType: NetDiskType): Promise<{
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;
});
return fetch(ExtServerApi + `auth/net-disk/token?netDiskType=${netDiskType}`).then((resp) => resp.json());
}
export function RefreshToken(
@ -32,27 +29,45 @@ export function RefreshToken(
netDiskType,
refreshToken,
}),
})
.then((resp) => resp.json())
.then((resp) => {
return resp.data;
});
}).then((resp) => resp.json());
}
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) {
if (globalThis.window) {
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();
}
} catch (e) {
clearInterval(t);
resolve();
}
}, 1000);
}, 1000);
} else {
chrome.tabs
.create({
url: `${ExtServer}api/v1/auth/net-disk?netDiskType=${netDiskType}`,
})
.then(({ id: tabId }) => {
const t = setInterval(async () => {
try {
const tab = await chrome.tabs.get(tabId!);
console.log("query tab", tab);
if (!tab) {
clearInterval(t);
resolve();
}
} catch (e) {
clearInterval(t);
resolve();
}
}, 1000);
});
}
});
}
@ -64,8 +79,15 @@ export type Token = {
export async function AuthVerify(netDiskType: NetDiskType, invalid?: boolean) {
let token: Token | undefined;
const localStorageDao = new LocalStorageDAO();
const key = `netdisk:token:${netDiskType}`;
try {
token = JSON.parse(localStorage[`netdisk:token:${netDiskType}`]);
token = await localStorageDao.get(key).then((resp) => {
if (resp) {
return resp.value;
}
return undefined;
});
} catch (e) {
// ignore
}
@ -83,7 +105,10 @@ export async function AuthVerify(netDiskType: NetDiskType, invalid?: boolean) {
createtime: Date.now(),
};
invalid = false;
localStorage[`netdisk:token:${netDiskType}`] = JSON.stringify(token);
await localStorageDao.save({
key,
value: token,
});
}
// token过期或者失效
if (Date.now() >= token.createtime + 3600000 || invalid) {
@ -91,7 +116,7 @@ export async function AuthVerify(netDiskType: NetDiskType, invalid?: boolean) {
try {
const resp = await RefreshToken(netDiskType, token.refreshToken);
if (resp.code !== 0) {
localStorage.removeItem(`netdisk:token:${netDiskType}`);
await localStorageDao.delete(key);
// 刷新失败,并且标记失效,尝试重新获取token
if (invalid) {
return AuthVerify(netDiskType);
@ -103,7 +128,11 @@ export async function AuthVerify(netDiskType: NetDiskType, invalid?: boolean) {
refreshToken: resp.data.token.refresh_token,
createtime: Date.now(),
};
localStorage[`netdisk:token:${netDiskType}`] = JSON.stringify(token);
// 更新token
await localStorageDao.save({
key,
value: token,
});
} catch (e) {
// 报错返回原token
return Promise.resolve(token.accessToken);

View File

@ -55,12 +55,11 @@ export default class BaiduFileSystem implements FileSystem {
});
}
// eslint-disable-next-line no-undef
request(url: string, config?: RequestInit) {
async request(url: string, config?: RequestInit) {
config = config || {};
const headers = <Headers>config.headers || new Headers();
// 处理请求匿名不发送cookie
chrome.declarativeNetRequest.updateDynamicRules({
await chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: [100],
addRules: [
{

View File

@ -1,5 +1,3 @@
/* eslint-disable max-classes-per-file */
/* eslint-disable import/prefer-default-export */
import { calculateMd5 } from "@App/pkg/utils/utils";
import { MD5 } from "crypto-js";
import { File, FileReader, FileWriter } from "../filesystem";

View File

@ -1,4 +1,3 @@
// eslint-disable-next-line import/prefer-default-export, max-classes-per-file
export class WarpTokenError {
error: Error;