/** * API endpoint para obtener las aplicaciones de Authentik * Devuelve todas las aplicaciones disponibles */ export default defineEventHandler(async (event) => { const config = useRuntimeConfig() const headers = getRequestHeaders(event) // Obtener el username desde los headers de Authentik const username = headers['x-authentik-username'] const userGroups = headers['x-authentik-groups']?.split('|').filter(g => g.trim()) || [] if (!username) { throw createError({ statusCode: 401, message: 'Usuario no autenticado' }) } // Obtener la URL y token de Authentik const authentikUrl = config.authentikApiUrl || config.public.authentikUrl const authentikToken = config.authentikApiToken if (!authentikToken) { throw createError({ statusCode: 500, message: 'Token de Authentik no configurado' }) } try { const response = await $fetch(`${authentikUrl}/api/v3/core/applications/`, { headers: { 'Authorization': `Bearer ${authentikToken}`, 'Content-Type': 'application/json' } }) const apps = response as any // Filtrar aplicaciones basándose en grupos (si están definidos) // Si la app no tiene grupos requeridos, está disponible para todos const filteredApps = apps.results.filter((app: any) => { // Si no hay launch_url, probablemente no sea una app accesible if (!app.launch_url) return false // Si no tiene grupos definidos, está disponible para todos if (!app.group || app.group.trim() === '') return true // Si el usuario es superuser, tiene acceso a todo if (headers['x-authentik-is-superuser'] === 'true') return true // Verificar si el usuario tiene alguno de los grupos requeridos const requiredGroups = app.group.split(',').map((g: string) => g.trim()) return requiredGroups.some((reqGroup: string) => userGroups.includes(reqGroup)) }) // Mapear a un formato más simple return filteredApps.map((app: any) => ({ pk: app.pk, name: app.name, slug: app.slug, launchUrl: app.launch_url, description: app.meta_description, icon: app.meta_icon, publisher: app.meta_publisher, group: app.group, openInNewTab: app.open_in_new_tab })) } catch (error: any) { console.error('Error al obtener aplicaciones de Authentik:', error) throw createError({ statusCode: error.statusCode || 500, message: error.message || 'Error al obtener las aplicaciones' }) } })