apploud-cli
Version:
CLI tool for Apploud container hosting management
105 lines (83 loc) • 4.07 kB
JavaScript
const axios = require('axios');
const chalk = require('chalk');
const open = require('open');
const inquirer = require('inquirer');
// Configuration
const APP_URL = process.env.APP_URL || 'http://localhost:8000';
const API_URL = `${APP_URL}/api`;
const CLI_API_URL = `${API_URL}/cli`;
console.log(chalk.blue('GitHub Auth Debug Utility'));
console.log('========================\n');
async function testGithubAuth() {
try {
console.log(chalk.yellow('Testing GitHub CLI authentication flow...'));
// Step 1: Call login endpoint to get redirect URL
console.log('\n1. Calling login endpoint...');
const loginResponse = await axios.post(`${CLI_API_URL}/login`, {}, {
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
validateStatus: () => true
});
console.log(`Status: ${loginResponse.status}`);
console.log('Response:', loginResponse.data);
if (loginResponse.status !== 200 || !loginResponse.data.redirect_url || !loginResponse.data.temp_token) {
console.error(chalk.red('❌ Login endpoint failed to return valid redirect URL or token'));
return;
}
const redirectUrl = loginResponse.data.redirect_url;
const tempToken = loginResponse.data.temp_token;
console.log(chalk.green('✓ Login endpoint returned valid redirect URL and temp token'));
// Step 2: Ask user if they want to open browser
const { openBrowser } = await inquirer.prompt([{
type: 'confirm',
name: 'openBrowser',
message: 'Would you like to open your browser to test GitHub authentication?',
default: true
}]);
if (openBrowser) {
console.log('\n2. Opening browser for GitHub authentication...');
console.log(` Redirect URL: ${redirectUrl}`);
await open(redirectUrl);
// Step 3: Start polling for token
console.log('\n3. Polling for authentication status...');
for (let i = 0; i < 30; i++) {
const statusResponse = await axios.get(`${CLI_API_URL}/status?temp_token=${tempToken}`, {
validateStatus: () => true
});
console.log(` Poll ${i+1}: Status = ${statusResponse.data.status}`);
if (statusResponse.data.status === 'authenticated') {
console.log(chalk.green('\n✓ Authentication successful!'));
// Get token
const tokenResponse = await axios.get(`${CLI_API_URL}/check-token?temp_token=${tempToken}`, {
validateStatus: () => true
});
if (tokenResponse.data.token) {
console.log(chalk.green('✓ Token retrieved successfully'));
console.log(chalk.yellow('Token value:'), tokenResponse.data.token.substring(0, 20) + '...[truncated]');
} else {
console.log(chalk.red('❌ Failed to retrieve token'));
}
break;
} else if (statusResponse.data.status === 'error') {
console.log(chalk.red(`\n❌ Authentication failed: ${statusResponse.data.message || 'Unknown error'}`));
break;
}
// Wait 2 seconds between polls
await new Promise(resolve => setTimeout(resolve, 2000));
}
} else {
console.log(chalk.yellow('\nSkipping browser authentication test.'));
}
console.log('\n' + chalk.green('Debug complete!'));
} catch (error) {
console.error(chalk.red('Error during debug:'), error.message);
if (error.response) {
console.error('Response status:', error.response.status);
console.error('Response data:', error.response.data);
}
}
}
testGithubAuth();