#!/usr/bin/env node
/**
* Debug the session handling issue in OAuth flow
* This script will track session cookies and debug session creation/retrieval
*/
const axios = require('axios');
const https = require('https');
// Create custom axios instance that accepts self-signed certificates
const httpClient = axios.create({
httpsAgent: new https.Agent({
rejectUnauthorized: false
}),
timeout: 30000
});
async function debugSessionHandling() {
console.log('\n🔍 Debug Session Handling in OAuth Flow');
console.log('=' .repeat(70));
// Use the new tunnel URL from the current server
const baseUrl = 'https://realtors-transmitted-necessary-wolf.trycloudflare.com';
const username = 'david+saola@umbrellacost.com';
const password = 'Dsamsung1!';
console.log('🌐 Testing with:');
console.log(` Base URL: ${baseUrl}`);
// Step 1: Access /authorize to get initial session/cookies
console.log('\n1️⃣ Initial /authorize call:');
const authParams = {
response_type: 'code',
client_id: 'claude-desktop',
redirect_uri: 'https://claude.ai/api/mcp/auth_callback',
state: 'test-state-12345',
code_challenge: 'test-challenge-code',
code_challenge_method: 'S256',
scope: 'openid profile email'
};
let cookies = new Map();
try {
const authUrl = `${baseUrl}/authorize?${new URLSearchParams(authParams)}`;
console.log(`Requesting: ${authUrl}`);
const authResponse = await httpClient.get(authUrl);
console.log(`✅ Status: ${authResponse.status}`);
console.log('Response type:', authResponse.headers['content-type']);
console.log('Set-Cookie headers:', authResponse.headers['set-cookie'] || 'None');
// Extract and store any cookies from /authorize
if (authResponse.headers['set-cookie']) {
authResponse.headers['set-cookie'].forEach(cookie => {
const [nameValue] = cookie.split(';');
const [name, value] = nameValue.split('=');
cookies.set(name, value);
console.log(`Stored cookie from /authorize: ${name}=${value}`);
});
}
console.log('Contains login form:', authResponse.data.includes('<form') ? 'Yes' : 'No');
console.log('Contains username field:', authResponse.data.includes('name="username"') ? 'Yes' : 'No');
console.log('Contains password field:', authResponse.data.includes('name="password"') ? 'Yes' : 'No');
} catch (error) {
console.log('❌ Failed to access authorize endpoint:', error.message);
if (error.response) {
console.log('Status:', error.response.status);
console.log('Headers:', error.response.headers);
}
return false;
}
// Step 2: Submit login with any existing cookies
console.log('\n2️⃣ Submit login credentials with existing cookies:');
try {
const loginData = {
username,
password,
...authParams // Include all OAuth params in login
};
// Build cookie header from any existing cookies
const cookieHeader = Array.from(cookies.entries())
.map(([name, value]) => `${name}=${value}`)
.join('; ');
console.log('Submitting login...');
console.log('Sending cookies:', cookieHeader || 'None');
const loginHeaders = {
'Content-Type': 'application/x-www-form-urlencoded'
};
if (cookieHeader) {
loginHeaders['Cookie'] = cookieHeader;
}
const loginResponse = await httpClient.post(
`${baseUrl}/login`,
new URLSearchParams(loginData),
{
headers: loginHeaders,
maxRedirects: 0,
validateStatus: (status) => status === 302 || status === 200
}
);
console.log(`Status: ${loginResponse.status}`);
console.log('Set-Cookie headers from login:', loginResponse.headers['set-cookie'] || 'None');
// Extract and store cookies from login response
if (loginResponse.headers['set-cookie']) {
loginResponse.headers['set-cookie'].forEach(cookie => {
const [nameValue] = cookie.split(';');
const [name, value] = nameValue.split('=');
cookies.set(name, value);
console.log(`Stored cookie from /login: ${name}=${value}`);
});
}
if (loginResponse.status === 302) {
console.log('✅ Login successful - got redirect');
const location = loginResponse.headers.location;
console.log('Redirect location:', location);
// Step 3: Follow the redirect with all cookies
console.log('\n3️⃣ Follow redirect with all cookies:');
// Update cookie header with all collected cookies
const fullCookieHeader = Array.from(cookies.entries())
.map(([name, value]) => `${name}=${value}`)
.join('; ');
console.log('Sending all cookies:', fullCookieHeader);
// Handle relative redirect URL
const fullRedirectUrl = location.startsWith('http') ? location : `${baseUrl}${location}`;
console.log('Full redirect URL:', fullRedirectUrl);
const redirectResponse = await httpClient.get(fullRedirectUrl, {
headers: {
'Cookie': fullCookieHeader
},
validateStatus: (status) => status >= 200 && status < 400
});
console.log(`Status: ${redirectResponse.status}`);
console.log('Response type:', redirectResponse.headers['content-type']);
console.log('Set-Cookie headers from redirect:', redirectResponse.headers['set-cookie'] || 'None');
if (redirectResponse.status === 200) {
console.log('Response length:', redirectResponse.data.length);
console.log('Contains redirect script:', redirectResponse.data.includes('window.location.href') ? 'Yes' : 'No');
console.log('Contains authorization code:', redirectResponse.data.includes('code=') ? 'Yes' : 'No');
// Look for the redirect URL in the response
const redirectMatch = redirectResponse.data.match(/const redirectUrl = '([^']+)'/);
if (redirectMatch) {
console.log('✅ Found redirect URL in script:', redirectMatch[1]);
// Check if it contains authorization code
const codeMatch = redirectMatch[1].match(/[?&]code=([^&]+)/);
if (codeMatch) {
console.log('✅ Authorization code found:', codeMatch[1]);
console.log('\n🎉 SUCCESS: OAuth flow working correctly!');
console.log(' - Session cookies preserved properly');
console.log(' - Authorization code generated successfully');
return true;
} else {
console.log('❌ No authorization code in redirect URL');
}
} else {
console.log('❌ No redirect script found in response');
console.log('Response preview:', redirectResponse.data.substring(0, 500));
}
}
} else if (loginResponse.status === 200) {
console.log('❌ Login failed - got form back');
// Check for error messages
if (loginResponse.data.includes('Invalid credentials') || loginResponse.data.includes('error')) {
console.log('❌ Found error message in login response');
}
console.log('Response preview:', loginResponse.data.substring(0, 300));
}
} catch (error) {
console.log('❌ Login submission failed:', error.message);
if (error.response) {
console.log('Status:', error.response.status);
console.log('Headers:', error.response.headers);
if (error.response.data) {
console.log('Response preview:', error.response.data.substring(0, 300));
}
}
return false;
}
return false;
}
// Run the debug test
debugSessionHandling().then(success => {
console.log('\n' + '=' .repeat(70));
if (success) {
console.log('✅ Session handling working correctly!');
} else {
console.log('❌ Session handling has issues that need investigation.');
console.log('Check the debug logs above for details.');
}
process.exit(success ? 0 : 1);
}).catch(err => {
console.error('Unexpected error:', err);
process.exit(1);
});