Skip auth if there's a valid lockfile and saved tokens

This commit is contained in:
Emilis Baliukonis 2025-04-25 16:46:53 +03:00
parent 504aa26761
commit 28b2e65214
3 changed files with 12 additions and 7 deletions

View file

@ -28,9 +28,6 @@ async function runClient(serverUrl: string, callbackPort: number, headers: Recor
// Get the server URL hash for lockfile operations // Get the server URL hash for lockfile operations
const serverUrlHash = getServerUrlHash(serverUrl) const serverUrlHash = getServerUrlHash(serverUrl)
// Coordinate authentication with other instances
const { server, waitForAuthCode, skipBrowserAuth } = await coordinateAuth(serverUrlHash, callbackPort, events)
// Create the OAuth client provider // Create the OAuth client provider
const authProvider = new NodeOAuthClientProvider({ const authProvider = new NodeOAuthClientProvider({
serverUrl, serverUrl,
@ -38,6 +35,10 @@ async function runClient(serverUrl: string, callbackPort: number, headers: Recor
clientName: 'MCP CLI Client', clientName: 'MCP CLI Client',
}) })
// Coordinate authentication with other instances
const hasSavedTokens = !!(await authProvider.tokens())
const { server, waitForAuthCode, skipBrowserAuth } = await coordinateAuth(serverUrlHash, callbackPort, events, hasSavedTokens)
// If auth was completed by another instance, just log that we'll use the auth from disk // If auth was completed by another instance, just log that we'll use the auth from disk
if (skipBrowserAuth) { if (skipBrowserAuth) {
log('Authentication was completed by another instance - will use tokens from disk...') log('Authentication was completed by another instance - will use tokens from disk...')
@ -99,6 +100,7 @@ async function runClient(serverUrl: string, callbackPort: number, headers: Recor
// Wait for the authorization code from the callback or another instance // Wait for the authorization code from the callback or another instance
const code = await waitForAuthCode() const code = await waitForAuthCode()
console.log('~~~ CLIENT - AUTH CODE ~~~', code)
try { try {
log('Completing authorization...') log('Completing authorization...')

View file

@ -93,12 +93,14 @@ export async function waitForAuthentication(port: number): Promise<boolean> {
* @param serverUrlHash The hash of the server URL * @param serverUrlHash The hash of the server URL
* @param callbackPort The port to use for the callback server * @param callbackPort The port to use for the callback server
* @param events The event emitter to use for signaling * @param events The event emitter to use for signaling
* @param hasSavedTokens Whether the client has saved tokens
* @returns An object with the server, waitForAuthCode function, and a flag indicating if browser auth can be skipped * @returns An object with the server, waitForAuthCode function, and a flag indicating if browser auth can be skipped
*/ */
export async function coordinateAuth( export async function coordinateAuth(
serverUrlHash: string, serverUrlHash: string,
callbackPort: number, callbackPort: number,
events: EventEmitter, events: EventEmitter,
hasSavedTokens: boolean,
): Promise<{ server: Server; waitForAuthCode: () => Promise<string>; skipBrowserAuth: boolean }> { ): Promise<{ server: Server; waitForAuthCode: () => Promise<string>; skipBrowserAuth: boolean }> {
// Check for a lockfile (disabled on Windows for the time being) // Check for a lockfile (disabled on Windows for the time being)
const lockData = process.platform === 'win32' ? null : await checkLockfile(serverUrlHash) const lockData = process.platform === 'win32' ? null : await checkLockfile(serverUrlHash)
@ -109,7 +111,7 @@ export async function coordinateAuth(
try { try {
// Try to wait for the authentication to complete // Try to wait for the authentication to complete
const authCompleted = await waitForAuthentication(lockData.port) const authCompleted = hasSavedTokens || (await waitForAuthentication(lockData.port))
if (authCompleted) { if (authCompleted) {
log('Authentication completed by another instance') log('Authentication completed by another instance')

View file

@ -25,9 +25,6 @@ async function runProxy(serverUrl: string, callbackPort: number, headers: Record
// Get the server URL hash for lockfile operations // Get the server URL hash for lockfile operations
const serverUrlHash = getServerUrlHash(serverUrl) const serverUrlHash = getServerUrlHash(serverUrl)
// Coordinate authentication with other instances
const { server, waitForAuthCode, skipBrowserAuth } = await coordinateAuth(serverUrlHash, callbackPort, events)
// Create the OAuth client provider // Create the OAuth client provider
const authProvider = new NodeOAuthClientProvider({ const authProvider = new NodeOAuthClientProvider({
serverUrl, serverUrl,
@ -35,6 +32,10 @@ async function runProxy(serverUrl: string, callbackPort: number, headers: Record
clientName: 'MCP CLI Proxy', clientName: 'MCP CLI Proxy',
}) })
// Coordinate authentication with other instances
const hasSavedTokens = !!(await authProvider.tokens())
const { server, waitForAuthCode, skipBrowserAuth } = await coordinateAuth(serverUrlHash, callbackPort, events, hasSavedTokens)
// If auth was completed by another instance, just log that we'll use the auth from disk // If auth was completed by another instance, just log that we'll use the auth from disk
if (skipBrowserAuth) { if (skipBrowserAuth) {
log('Authentication was completed by another instance - will use tokens from disk') log('Authentication was completed by another instance - will use tokens from disk')