Skip to main content
Glama
debug-session-issue.cjs8.04 kB
#!/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); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/daviddraiumbrella/invoice-monitoring'

If you have feedback or need assistance with the MCP directory API, please join our Discord server