Automatically detect non-interactive environments and fall back to a manual, code-based authentication flow (#4475)

This commit is contained in:
Marat Boshernitsan
2025-07-18 17:22:50 -07:00
committed by GitHub
parent 003609239f
commit 5b7b6fe608
6 changed files with 73 additions and 8 deletions

View File

@@ -26,6 +26,7 @@ import {
clearCachedGoogleAccount,
} from '../utils/user_account.js';
import { AuthType } from '../core/contentGenerator.js';
import { shouldAttemptBrowserLaunch } from '../utils/browser.js';
import readline from 'node:readline';
// OAuth Client ID used to initiate OAuth2Client class.
@@ -121,7 +122,7 @@ export async function getOauthClient(
}
}
if (config.getNoBrowser()) {
if (config.getNoBrowser() || !shouldAttemptBrowserLaunch()) {
let success = false;
const maxRetries = 2;
for (let i = 0; !success && i < maxRetries; i++) {
@@ -156,15 +157,17 @@ export async function getOauthClient(
// causing the entire Node.js process to crash.
childProcess.on('error', (_) => {
console.error(
'Failed to open browser automatically. Please open the URL manually:',
'Failed to open browser automatically. Please try running again with NO_BROWSER=true set.',
);
console.error(webLogin.authUrl);
process.exit(1);
});
} catch (err) {
console.error(
'An unexpected error occurred while trying to open the browser:',
err,
'\nPlease try running again with NO_BROWSER=true set.',
);
process.exit(1);
}
console.log('Waiting for authentication...');
@@ -175,7 +178,7 @@ export async function getOauthClient(
}
async function authWithUserCode(client: OAuth2Client): Promise<boolean> {
const redirectUri = 'https://sdk.cloud.google.com/authcode_cloudcode.html';
const redirectUri = 'https://codeassist.google.com/authcode';
const codeVerifier = await client.generateCodeVerifierAsync();
const state = crypto.randomBytes(32).toString('hex');
const authUrl: string = client.generateAuthUrl({