fix(oauth): align antigravity OAuth metadata with official client headers

Fixes #1226

The Antigravity OAuth flow sent inconsistent client metadata between
the token acquisition phase and the API usage phase. String enum values
(IDE_UNSPECIFIED, PLATFORM_UNSPECIFIED) were used during OAuth token
exchange + loadCodeAssist + onboardUser, while numeric enums (ideType: 9,
platform: <computed>, pluginType: 2) were used in runtime API calls.
Google detected this fingerprint mismatch and blocked 9router accounts.

Replace all string enum occurrences with the correct numeric values:

- src/lib/oauth/constants/oauth.js: loadCodeAssistClientMetadata now
  uses getOAuthPlatformEnum() for platform and numeric 9/2 for
  ideType/pluginType, matching getOAuthClientMetadata()
- src/lib/oauth/services/antigravity.js: getMetadata() now delegates
  to getOAuthClientMetadata() instead of returning hardcoded strings
- src/lib/oauth/providers.js: postExchange metadata now uses
  getOAuthClientMetadata() instead of inline string enums
- open-sse/services/usage.js: getGeminiSubscriptionInfo body now uses
  CLIENT_METADATA (already imported from appConstants.js) instead of
  inline string enums
This commit is contained in:
Z User
2026-05-18 15:23:37 +07:00
committed by decolua
parent 5e1c126136
commit 8daa953ef6
4 changed files with 9 additions and 16 deletions
+1 -5
View File
@@ -305,11 +305,7 @@ async function getGeminiSubscriptionInfo(accessToken, proxyOptions = null) {
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
body: JSON.stringify({ body: JSON.stringify({
metadata: { metadata: CLIENT_METADATA,
ideType: "IDE_UNSPECIFIED",
platform: "PLATFORM_UNSPECIFIED",
pluginType: "GEMINI",
},
}), }),
signal: controller.signal, signal: controller.signal,
}, },
+2 -2
View File
@@ -108,8 +108,8 @@ export const ANTIGRAVITY_CONFIG = {
onboardUserEndpoint: "https://cloudcode-pa.googleapis.com/v1internal:onboardUser", onboardUserEndpoint: "https://cloudcode-pa.googleapis.com/v1internal:onboardUser",
loadCodeAssistUserAgent: "google-api-nodejs-client/9.15.1", loadCodeAssistUserAgent: "google-api-nodejs-client/9.15.1",
loadCodeAssistApiClient: "google-cloud-sdk vscode_cloudshelleditor/0.1", loadCodeAssistApiClient: "google-cloud-sdk vscode_cloudshelleditor/0.1",
// String enum matches CLIProxyAPI Go source (internal/auth/antigravity/constants.go) // Numeric enums matching Antigravity binary ClientMetadata (see getOAuthClientMetadata below)
loadCodeAssistClientMetadata: JSON.stringify({ ideType: "IDE_UNSPECIFIED", platform: "PLATFORM_UNSPECIFIED", pluginType: "GEMINI" }), loadCodeAssistClientMetadata: JSON.stringify({ ideType: 9, platform: getOAuthPlatformEnum(), pluginType: 2 }),
}; };
/** /**
+3 -2
View File
@@ -23,6 +23,7 @@ import {
CLINE_CONFIG, CLINE_CONFIG,
GITLAB_CONFIG, GITLAB_CONFIG,
CODEBUDDY_CONFIG, CODEBUDDY_CONFIG,
getOAuthClientMetadata,
} from "./constants/oauth"; } from "./constants/oauth";
const BASE64_BLOCK_SIZE = 4; const BASE64_BLOCK_SIZE = 4;
@@ -306,7 +307,7 @@ const PROVIDERS = {
return await response.json(); return await response.json();
}, },
postExchange: async (tokens) => { postExchange: async (tokens) => {
// Matches CLIProxyAPI Go source: string enum, no mode field // Numeric enums matching Antigravity binary ClientMetadata
const loadHeaders = { const loadHeaders = {
"Authorization": `Bearer ${tokens.access_token}`, "Authorization": `Bearer ${tokens.access_token}`,
"Content-Type": "application/json", "Content-Type": "application/json",
@@ -315,7 +316,7 @@ const PROVIDERS = {
"Client-Metadata": ANTIGRAVITY_CONFIG.loadCodeAssistClientMetadata, "Client-Metadata": ANTIGRAVITY_CONFIG.loadCodeAssistClientMetadata,
"x-request-source": "local", "x-request-source": "local",
}; };
const metadata = { ideType: "IDE_UNSPECIFIED", platform: "PLATFORM_UNSPECIFIED", pluginType: "GEMINI" }; const metadata = getOAuthClientMetadata();
// Fetch user info // Fetch user info
const userInfoRes = await fetch(`${ANTIGRAVITY_CONFIG.userInfoUrl}?alt=json`, { const userInfoRes = await fetch(`${ANTIGRAVITY_CONFIG.userInfoUrl}?alt=json`, {
+3 -7
View File
@@ -1,6 +1,6 @@
import crypto from "crypto"; import crypto from "crypto";
import open from "open"; import open from "open";
import { ANTIGRAVITY_CONFIG } from "../constants/oauth.js"; import { ANTIGRAVITY_CONFIG, getOAuthClientMetadata } from "../constants/oauth.js";
import { getServerCredentials } from "../config/index.js"; import { getServerCredentials } from "../config/index.js";
import { startLocalServer } from "../utils/server.js"; import { startLocalServer } from "../utils/server.js";
import { spinner as createSpinner } from "../utils/ui.js"; import { spinner as createSpinner } from "../utils/ui.js";
@@ -92,14 +92,10 @@ export class AntigravityService {
/** /**
* Get metadata object for loadCodeAssist / onboardUser API calls. * Get metadata object for loadCodeAssist / onboardUser API calls.
* Uses string enum values matching CLIProxyAPI Go source. * Uses numeric enum values matching Antigravity binary ClientMetadata.
*/ */
getMetadata() { getMetadata() {
return { return getOAuthClientMetadata();
ideType: "IDE_UNSPECIFIED",
platform: "PLATFORM_UNSPECIFIED",
pluginType: "GEMINI",
};
} }
/** /**