#!/usr/bin/env node
/**
* Direct test of Umbrella API authentication
* Tests both Keycloak and Cognito endpoints
*/
const axios = require('axios');
const UMBRELLA_BASE_URL = 'https://api.umbrellacost.io';
const USERNAME = 'david+saola@umbrellacost.com';
const PASSWORD = 'Dsamsung1!';
// Create axios instance with defaults
const api = axios.create({
baseURL: UMBRELLA_BASE_URL,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'User-Agent': 'UmbrellaMCP/2.0.0'
},
timeout: 30000
});
// Add request/response interceptor for debugging
api.interceptors.request.use(request => {
console.log('\n📤 REQUEST:', request.method.toUpperCase(), request.url);
console.log('Headers:', JSON.stringify(request.headers, null, 2));
if (request.data) {
console.log('Body:', JSON.stringify(request.data, null, 2));
}
return request;
});
api.interceptors.response.use(
response => {
console.log('✅ RESPONSE:', response.status, response.statusText);
console.log('Headers:', JSON.stringify(response.headers, null, 2));
if (response.data) {
console.log('Data:', JSON.stringify(response.data, null, 2));
}
return response;
},
error => {
if (error.response) {
console.error('❌ ERROR RESPONSE:', error.response.status, error.response.statusText);
console.error('Headers:', JSON.stringify(error.response.headers, null, 2));
if (error.response.data) {
console.error('Error Data:', JSON.stringify(error.response.data, null, 2));
}
} else if (error.request) {
console.error('❌ NO RESPONSE:', error.message);
} else {
console.error('❌ REQUEST ERROR:', error.message);
}
return Promise.reject(error);
}
);
async function testUserRealm() {
console.log('\n' + '='.repeat(60));
console.log('1️⃣ Testing User Realm Detection');
console.log('='.repeat(60));
try {
const response = await api.get('/user-management/users/user-realm', {
params: { email: USERNAME }
});
console.log('\n✅ User Realm Detection Successful!');
console.log('Realm ID:', response.data.realmId);
console.log('User is on:', response.data.realmId ? 'Keycloak' : 'Cognito');
return response.data;
} catch (error) {
console.error('\n❌ User Realm Detection Failed');
return null;
}
}
async function testKeycloakAuth() {
console.log('\n' + '='.repeat(60));
console.log('2️⃣ Testing Keycloak Authentication');
console.log('='.repeat(60));
try {
// Try different variations of the Keycloak endpoint
const endpoints = [
'/authentication/token/generate',
'/auth/token/generate',
'/token/generate'
];
for (const endpoint of endpoints) {
console.log(`\nTrying endpoint: ${endpoint}`);
try {
const response = await api.post(endpoint, {
username: USERNAME,
password: PASSWORD
});
console.log('\n✅ Keycloak Authentication Successful!');
console.log('Token:', response.data.access_token ? 'Present' : 'Missing');
console.log('Expires In:', response.data.expires_in);
return response.data;
} catch (error) {
console.log(`Failed with ${error.response?.status || error.message}`);
}
}
// Also try with different request formats
console.log('\nTrying form-urlencoded format...');
const params = new URLSearchParams();
params.append('username', USERNAME);
params.append('password', PASSWORD);
params.append('grant_type', 'password');
try {
const response = await api.post('/authentication/token/generate', params, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
console.log('\n✅ Keycloak Authentication Successful (form-urlencoded)!');
return response.data;
} catch (error) {
console.log(`Failed with ${error.response?.status || error.message}`);
}
} catch (error) {
console.error('\n❌ All Keycloak Authentication Attempts Failed');
return null;
}
}
async function testCognitoAuth() {
console.log('\n' + '='.repeat(60));
console.log('3️⃣ Testing Cognito Authentication');
console.log('='.repeat(60));
try {
// Try different Cognito endpoint variations
const endpoints = [
'/users/signin',
'/user/signin',
'/auth/signin'
];
for (const endpoint of endpoints) {
console.log(`\nTrying endpoint: ${endpoint}`);
try {
const response = await api.post(endpoint, {
username: USERNAME,
password: PASSWORD
});
console.log('\n✅ Cognito Authentication Successful!');
console.log('Token:', response.data.AuthenticationResult?.AccessToken ? 'Present' : 'Missing');
return response.data;
} catch (error) {
console.log(`Failed with ${error.response?.status || error.message}`);
}
}
// Try with email instead of username
console.log('\nTrying with email field...');
try {
const response = await api.post('/users/signin', {
email: USERNAME,
password: PASSWORD
});
console.log('\n✅ Cognito Authentication Successful (email field)!');
return response.data;
} catch (error) {
console.log(`Failed with ${error.response?.status || error.message}`);
}
} catch (error) {
console.error('\n❌ All Cognito Authentication Attempts Failed');
return null;
}
}
async function testDirectAuth() {
console.log('\n' + '='.repeat(60));
console.log('4️⃣ Testing Direct Authentication (no realm check)');
console.log('='.repeat(60));
try {
// Try a generic auth endpoint
const endpoints = [
'/auth/login',
'/authenticate',
'/login',
'/auth'
];
for (const endpoint of endpoints) {
console.log(`\nTrying endpoint: ${endpoint}`);
try {
const response = await api.post(endpoint, {
username: USERNAME,
password: PASSWORD
});
console.log('\n✅ Direct Authentication Successful!');
return response.data;
} catch (error) {
console.log(`Failed with ${error.response?.status || error.message}`);
}
}
} catch (error) {
console.error('\n❌ All Direct Authentication Attempts Failed');
return null;
}
}
async function main() {
console.log('🔐 Testing Umbrella API Authentication');
console.log('Base URL:', UMBRELLA_BASE_URL);
console.log('Username:', USERNAME);
console.log('Password:', '*'.repeat(PASSWORD.length));
// Test 1: User realm detection
const realmInfo = await testUserRealm();
// Test 2: Keycloak auth (if user is on Keycloak)
if (realmInfo?.realmId) {
await testKeycloakAuth();
}
// Test 3: Cognito auth (fallback)
await testCognitoAuth();
// Test 4: Try direct auth endpoints
await testDirectAuth();
console.log('\n' + '='.repeat(60));
console.log('📊 Test Summary');
console.log('='.repeat(60));
console.log('User realm detection: ', realmInfo ? '✅ Working' : '❌ Failed');
console.log('User system: ', realmInfo?.realmId ? 'Keycloak' : 'Cognito');
console.log('\nAuthentication is failing - need to investigate further');
console.log('Possible issues:');
console.log('- Missing required headers (e.g., API key, client ID)');
console.log('- Incorrect request format or parameters');
console.log('- Account permissions or configuration issues');
console.log('- API endpoint changes or maintenance');
}
main().catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});