mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 13:38:31 +00:00
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:
@@ -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,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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 }),
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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`, {
|
||||||
|
|||||||
@@ -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",
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user