Skip to content

Commit 433c298

Browse files
author
Deep-sea-school
committed
更改逻辑改为调用系统浏览器执行,之后轮巡localstorage
1 parent dc76fba commit 433c298

1 file changed

Lines changed: 58 additions & 5 deletions

File tree

src/lib/github-oauth.js

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,16 @@ class GitHubOAuthService {
6868
try {
6969
// 检查是否在 Electron 环境中
7070
if (this.isElectron) {
71-
// 在 Electron 中,使用 window.open 打开 oauth-proxy 页面
72-
// 它会被 handleWindowOpen 捕获并正确配置
73-
window.open('https://idyllic-kangaroo-a50663.netlify.app/', '_blank', 'width=600,height=800');
71+
// 在 Electron 中,使用 shell.openExternal 打开系统浏览器
72+
if (window.EditorPreload && typeof window.EditorPreload.openExternalUrl === 'function') {
73+
await window.EditorPreload.openExternalUrl('https://idyllic-kangaroo-a50663.netlify.app/');
74+
} else {
75+
// 如果没有 openExternal 方法,则尝试使用 window.open,这将打开系统浏览器
76+
window.open('https://idyllic-kangaroo-a50663.netlify.app/', '_system');
77+
}
7478

75-
// 启动轮询检查是否收到 token,并返回结果
76-
return await this.pollForToken();
79+
// 启动轮询检查 localStorage 中的 token,并返回结果
80+
return await this.pollForLocalStorageToken();
7781
} else {
7882
// 在浏览器环境中,生成 PKCE 挑战码
7983
const codeVerifier = this.generateRandomString(128);
@@ -152,6 +156,55 @@ class GitHubOAuthService {
152156
poll();
153157
});
154158
}
159+
160+
/**
161+
* 轮询检查 localStorage 中的 token
162+
* @returns {Promise<Object>} 用户信息
163+
*/
164+
async pollForLocalStorageToken() {
165+
return new Promise((resolve, reject) => {
166+
const maxAttempts = 180; // 最多等待 90 秒 (180 次 * 500ms)
167+
let attempts = 0;
168+
169+
const poll = async () => {
170+
attempts++;
171+
172+
if (attempts > maxAttempts) {
173+
reject(new Error('OAuth timeout: No token received within 90 seconds'));
174+
return;
175+
}
176+
177+
try {
178+
// 检查是否在 localStorage 中存在 OAuth 相关信息(从 oauth-proxy 页面写入的)
179+
const token = localStorage.getItem('oauth_token_received');
180+
const user = localStorage.getItem('github_user');
181+
const email = localStorage.getItem('github_email');
182+
183+
if (token && user && email) {
184+
// 清除临时存储
185+
localStorage.removeItem('oauth_token_received');
186+
187+
// 保存到正常的存储位置
188+
localStorage.setItem(this.tokenStorageKey, token);
189+
localStorage.setItem(this.userStorageKey, user);
190+
localStorage.setItem(this.emailStorageKey, email);
191+
192+
// 返回用户信息
193+
const userInfo = JSON.parse(user);
194+
resolve({ user: userInfo, email, token });
195+
return;
196+
}
197+
} catch (error) {
198+
console.error('Error checking for token in localStorage:', error);
199+
}
200+
201+
setTimeout(poll, 500); // 每 500ms 检查一次
202+
};
203+
204+
// 立即开始轮询,然后定期检查
205+
poll();
206+
});
207+
}
155208

156209
/**
157210
* 处理 OAuth 回调

0 commit comments

Comments
 (0)