export async function loginGeminiCliOAuth(
ctx: GeminiCliOAuthContext,
): Promise<GeminiCliOAuthCredentials> { const needsManual = shouldUseManualOAuthFlow(ctx.isRemote);
await ctx.note(
needsManual
? [ "You are running in a remote/VPS environment.", "A URL will be shown for you to open in your LOCAL browser.", "After signing in, copy the redirect URL and paste it back here.",
].join("\n")
: [ "Browser will open for Google authentication.", "Sign in with your Google account for Gemini CLI access.", "The callback will be captured automatically on localhost:8085.",
].join("\n"), "Gemini CLI OAuth",
);
if (needsManual) { return manualFlow(ctx, authUrl, state, verifier);
}
ctx.progress.update("Complete sign-in in browser..."); try {
await ctx.openUrl(authUrl);
} catch {
ctx.log(`\nOpen this URL in your browser:\n\n${authUrl}\n`);
}
async function manualFlow(
ctx: GeminiCliOAuthContext,
authUrl: string,
state: string,
verifier: string,
cause?: Error,
): Promise<GeminiCliOAuthCredentials> {
ctx.progress.update("OAuth URL ready");
ctx.log(`\nOpen this URL in your LOCAL browser:\n\n${authUrl}\n`);
ctx.progress.update("Waiting for you to paste the callback URL..."); const callbackInput = await ctx.prompt("Paste the redirect URL here: "); const parsed = parseCallbackInput(callbackInput); if ("error" in parsed) { thrownew Error(parsed.error, cause ? { cause } : undefined);
} if (parsed.state !== state) { thrownew Error("OAuth state mismatch - please try again", cause ? { cause } : undefined);
}
ctx.progress.update("Exchanging authorization code for tokens..."); return exchangeCodeForTokens(parsed.code, verifier);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet am 2026-06-05)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.