@@ -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