()
| 1296 | } |
| 1297 | |
| 1298 | async function processCallbackUrl() { |
| 1299 | const callbackUrl = document.getElementById('callbackUrlInput').value.trim(); |
| 1300 | |
| 1301 | if (!callbackUrl) { |
| 1302 | showStatus('请输入回调URL', 'error'); |
| 1303 | return; |
| 1304 | } |
| 1305 | |
| 1306 | if (!callbackUrl.startsWith('http://') && !callbackUrl.startsWith('https://')) { |
| 1307 | showStatus('请输入有效的URL(以http://或https://开头)', 'error'); |
| 1308 | return; |
| 1309 | } |
| 1310 | |
| 1311 | if (!callbackUrl.includes('code=') || !callbackUrl.includes('state=')) { |
| 1312 | showStatus('❌ 这不是有效的回调URL!请确保:\n1. 已完成Google OAuth授权\n2. 复制的是浏览器地址栏的完整URL\n3. URL包含code和state参数', 'error'); |
| 1313 | return; |
| 1314 | } |
| 1315 | |
| 1316 | showStatus('正在从回调URL获取凭证...', 'info'); |
| 1317 | |
| 1318 | try { |
| 1319 | const projectId = document.getElementById('projectId')?.value.trim() || null; |
| 1320 | |
| 1321 | const response = await fetch('./auth/callback-url', { |
| 1322 | method: 'POST', |
| 1323 | headers: getAuthHeaders(), |
| 1324 | body: JSON.stringify({ callback_url: callbackUrl, project_id: projectId }) |
| 1325 | }); |
| 1326 | |
| 1327 | const result = await response.json(); |
| 1328 | |
| 1329 | if (result.credentials) { |
| 1330 | showStatus(result.message || '从回调URL获取凭证成功!', 'success'); |
| 1331 | document.getElementById('credentialsContent').innerHTML = '<pre>' + JSON.stringify(result.credentials, null, 2) + '</pre>'; |
| 1332 | document.getElementById('credentialsSection').classList.remove('hidden'); |
| 1333 | } else if (result.requires_manual_project_id) { |
| 1334 | showStatus('需要手动指定项目ID,请在高级选项中填入Google Cloud项目ID后重试', 'error'); |
| 1335 | } else if (result.requires_project_selection) { |
| 1336 | let msg = '<br><strong>可用项目:</strong><br>'; |
| 1337 | result.available_projects.forEach(p => { |
| 1338 | msg += `• ${p.name} (ID: ${p.project_id})<br>`; |
| 1339 | }); |
| 1340 | showStatus('检测到多个项目,请在高级选项中指定项目ID:' + msg, 'error'); |
| 1341 | } else { |
| 1342 | showStatus(result.error || '从回调URL获取凭证失败', 'error'); |
| 1343 | } |
| 1344 | |
| 1345 | document.getElementById('callbackUrlInput').value = ''; |
| 1346 | } catch (error) { |
| 1347 | showStatus(`从回调URL获取凭证失败: ${error.message}`, 'error'); |
| 1348 | } |
| 1349 | } |
| 1350 | |
| 1351 | async function processAntigravityCallbackUrl() { |
| 1352 | const callbackUrl = document.getElementById('antigravityCallbackUrlInput').value.trim(); |
nothing calls this directly
no test coverage detected