Skip to content

Commit 963a6d2

Browse files
committed
🐛 修复网盘登录掉了之后无法重新登录的问题 #210
1 parent fc6d14d commit 963a6d2

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

pkg/filesystem/auth.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,15 @@ export type Token = {
6060
createtime: number;
6161
};
6262

63-
export async function AuthVerify(netDiskType: NetDiskType, reapply?: boolean) {
63+
export async function AuthVerify(netDiskType: NetDiskType, invalid?: boolean) {
6464
let token: Token | undefined;
6565
try {
6666
token = JSON.parse(localStorage[`netdisk:token:${netDiskType}`]);
6767
} catch (e) {
6868
// ignore
6969
}
70-
if (reapply || !token || !token.accessToken) {
70+
// token不存在,或者没有accessToken,重新获取
71+
if (!token || !token.accessToken) {
7172
// 强制重新获取token
7273
await NetDisk(netDiskType);
7374
const resp = await GetNetDiskToken(netDiskType);
@@ -79,15 +80,20 @@ export async function AuthVerify(netDiskType: NetDiskType, reapply?: boolean) {
7980
refreshToken: resp.data.token.refresh_token,
8081
createtime: Date.now(),
8182
};
83+
invalid = false;
8284
localStorage[`netdisk:token:${netDiskType}`] = JSON.stringify(token);
8385
}
84-
if (Date.now() >= token.createtime + 3600000) {
86+
// token过期或者失效
87+
if (Date.now() >= token.createtime + 3600000 || invalid) {
8588
// 大于一小时刷新token
8689
try {
8790
const resp = await RefreshToken(netDiskType, token.refreshToken);
8891
if (resp.code !== 0) {
89-
// 刷新失败删除token
9092
localStorage.removeItem(`netdisk:token:${netDiskType}`);
93+
// 刷新失败,并且标记失效,尝试重新获取token
94+
if (invalid) {
95+
return AuthVerify(netDiskType);
96+
}
9197
return Promise.reject(new Error(resp.msg));
9298
}
9399
token = {

pkg/filesystem/baidu/baidu.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default class BaiduFileSystem implements FileSystem {
2222
async verify(): Promise<void> {
2323
const token = await AuthVerify("baidu");
2424
this.accessToken = token;
25-
return Promise.resolve();
25+
return this.list().then();
2626
}
2727

2828
open(file: File): Promise<FileReader> {
@@ -78,12 +78,14 @@ export default class BaiduFileSystem implements FileSystem {
7878
return fetch(url, config)
7979
.then((data) => data.json())
8080
.then(async (data) => {
81-
if (data.errno === 111) {
82-
await this.verify();
81+
if (data.errno === 111 || data.errno === -6) {
82+
const token = await AuthVerify("baidu", true);
83+
this.accessToken = token;
84+
url = url.replace(/access_token=[^&]+/, `access_token=${token}`);
8385
return fetch(url, config)
8486
.then((data2) => data2.json())
8587
.then((data2) => {
86-
if (data2.errno === 111) {
88+
if (data2.errno === 111 || data2.errno === -6) {
8789
throw new Error(JSON.stringify(data2));
8890
}
8991
return data2;

pkg/filesystem/onedrive/onedrive.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default class OneDriveFileSystem implements FileSystem {
2222
async verify(): Promise<void> {
2323
const token = await AuthVerify("onedrive");
2424
this.accessToken = token;
25-
return Promise.resolve();
25+
return this.list().then();
2626
}
2727

2828
open(file: File): Promise<FileReader> {
@@ -73,7 +73,7 @@ export default class OneDriveFileSystem implements FileSystem {
7373
"@microsoft.graph.conflictBehavior": "replace",
7474
}),
7575
}
76-
).then((data) => {
76+
).then((data: any) => {
7777
if (data.errno) {
7878
throw new Error(JSON.stringify(data));
7979
}
@@ -85,7 +85,6 @@ export default class OneDriveFileSystem implements FileSystem {
8585
request(url: string, config?: RequestInit, nothen?: boolean) {
8686
config = config || {};
8787
const headers = <Headers>config.headers || new Headers();
88-
// 利用GM函数的匿名实现不发送cookie,因为某些情况cookie会导致-6错误
8988
headers.append(`Authorization`, `Bearer ${this.accessToken}`);
9089
config.headers = headers;
9190
const ret = fetch(url, config);
@@ -96,6 +95,19 @@ export default class OneDriveFileSystem implements FileSystem {
9695
.then((data) => data.json())
9796
.then(async (data) => {
9897
if (data.error) {
98+
if (data.error.code === "InvalidAuthenticationToken") {
99+
const token = await AuthVerify("onedrive", true);
100+
this.accessToken = token;
101+
headers.set(`Authorization`, `Bearer ${this.accessToken}`);
102+
return fetch(url, config)
103+
.then((retryData) => retryData.json())
104+
.then((retryData) => {
105+
if (retryData.error) {
106+
throw new Error(JSON.stringify(retryData));
107+
}
108+
return data;
109+
});
110+
}
99111
throw new Error(JSON.stringify(data));
100112
}
101113
return data;
@@ -128,6 +140,7 @@ export default class OneDriveFileSystem implements FileSystem {
128140
return this.request(
129141
`https://graph.microsoft.com/v1.0/me/drive/special/approot:${path}:/children`
130142
).then((data) => {
143+
console.log(data);
131144
const list: File[] = [];
132145
data.value.forEach((val: any) => {
133146
list.push({

0 commit comments

Comments
 (0)