78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
import { defineEventHandler, createError } from 'h3';
|
|
import { getSessionFromCookie } from '~/server/utils/sessionStore';
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
console.log('🌐 Proxy: External token validation requested');
|
|
|
|
const config = useRuntimeConfig();
|
|
|
|
try {
|
|
// 1. Get current session to retrieve access token
|
|
const session = await getSessionFromCookie(event);
|
|
|
|
if (!session || !session.accessToken) {
|
|
console.log('❌ Proxy: No valid session or access token found');
|
|
throw createError({
|
|
statusCode: 401,
|
|
statusMessage: 'Unauthorized: No valid session found',
|
|
});
|
|
}
|
|
|
|
const accessToken = session.accessToken;
|
|
|
|
// Log token details for debugging audience and claims
|
|
try {
|
|
const payloadPart = accessToken.split('.')[1];
|
|
const payload = JSON.parse(Buffer.from(payloadPart, 'base64').toString());
|
|
console.log('🎫 Full Token Payload:', JSON.stringify(payload, null, 2));
|
|
console.log('🎫 Token Audience (aud):', payload.aud);
|
|
} catch (e) {
|
|
console.warn('⚠️ Proxy: Failed to parse token for logging');
|
|
}
|
|
|
|
const externalApiUrl = `${config.externalApiBaseUrl}/api/v1/auth/me`;
|
|
|
|
console.log(`📡 Proxy: Calling external API: ${externalApiUrl}`);
|
|
|
|
// 2. Call external API with Bearer token
|
|
// We use $fetch from ofetch (auto-imported in Nuxt/Nitro)
|
|
const response = await $fetch(externalApiUrl, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Authorization': `Bearer ${accessToken}`,
|
|
'Accept': 'application/json',
|
|
},
|
|
timeout: config.externalApiTimeout || 10000,
|
|
});
|
|
|
|
console.log('✅ Proxy: External API call successful');
|
|
|
|
return {
|
|
success: true,
|
|
data: response,
|
|
timestamp: new Date().toISOString()
|
|
};
|
|
|
|
} catch (error: any) {
|
|
console.error('❌ Proxy: External API call failed:', error.message);
|
|
|
|
// Check if it's an HTTP error from the external API
|
|
const statusCode = error.response?.status || 500;
|
|
const statusText = error.response?.statusText || 'External API Error';
|
|
const errorData = error.response?._data || error.data || null;
|
|
|
|
console.error(` Status: ${statusCode} ${statusText}`);
|
|
if (errorData) {
|
|
console.error(' Error Data:', JSON.stringify(errorData));
|
|
}
|
|
|
|
return {
|
|
success: false,
|
|
error: statusText,
|
|
statusCode: statusCode,
|
|
details: errorData || error.message,
|
|
timestamp: new Date().toISOString()
|
|
};
|
|
}
|
|
});
|