Clean up codebase and prepare as template
All checks were successful
build-and-deploy / build (push) Successful in 2m1s
build-and-deploy / deploy (push) Successful in 4s

Remove unused files and code:
- Delete test/debug endpoints (test.get.ts, public.get.ts, user.get.ts, debug-config backup)
- Remove unused OAuth wrapper (oauth-authentik.ts)
- Clean up debug console.log statements
- Simplify code comments

Fix TypeScript errors:
- Add @types/node dependency
- Create index.d.ts with User interface extension
- Fix UButton color props (red→error, gray→neutral)
- Add type assertions in protected.get.ts

Update documentation:
- Enhance README.md as template documentation
- Update SETUP.md with correct API routes (/api/auth/* instead of /auth/*)
- Add NUXT_OAUTH_AUTHENTIK_SERVER_URL_INTERNAL documentation
- Update endpoint documentation

This commit prepares the repository to be used as a template for future Nuxt 4 + Authentik OAuth projects.
This commit is contained in:
2025-10-11 19:18:52 -06:00
parent 174e9565b8
commit b9ba7a80db
15 changed files with 158 additions and 241 deletions

View File

@@ -3,15 +3,12 @@ import { withQuery } from 'ufo'
/**
* OAuth Authentik Login Handler
* Ruta: /api/auth/authentik
*
* Este endpoint inicia el flujo OAuth con Authentik
* Handles OAuth flow: initial redirect and callback
*/
export default defineEventHandler(async (event) => {
const runtimeConfig = useRuntimeConfig(event)
const query = getQuery(event)
// Configuración de Authentik
const config = {
clientId: runtimeConfig.oauth.authentik.clientId,
clientSecret: runtimeConfig.oauth.authentik.clientSecret,
@@ -21,13 +18,6 @@ export default defineEventHandler(async (event) => {
scope: ['openid', 'profile', 'email'],
}
console.log('OAuth Authentik - Iniciando flujo:', {
serverUrl: config.serverUrl,
serverUrlInternal: config.serverUrlInternal,
redirectURL: config.redirectURL,
hasCode: !!query.code
})
// Handle OAuth callback
if (query.code) {
try {
@@ -70,7 +60,6 @@ export default defineEventHandler(async (event) => {
loggedInAt: Date.now()
})
// Redirigir al dashboard después del login
return sendRedirect(event, '/')
} catch (error: any) {
console.error('Authentik OAuth error:', error)
@@ -89,6 +78,5 @@ export default defineEventHandler(async (event) => {
}
)
console.log('Redirecting to:', authorizationUrl)
return sendRedirect(event, authorizationUrl)
})

View File

@@ -1,8 +1,6 @@
/**
* Logout Handler
* Ruta: /api/auth/logout
*
* Limpia la sesión del usuario y redirige a la página de inicio
* Clears user session and redirects to home
*/
export default defineEventHandler(async (event) => {
await clearUserSession(event)

View File

@@ -1,7 +0,0 @@
/**
* Test endpoint
* Ruta: /api/auth/test
*/
export default defineEventHandler(() => {
return { message: 'Auth subfolder works!' }
})

View File

@@ -1,31 +0,0 @@
/**
* Debug Config Endpoint
* Ruta: /api/debug-config
*
* TEMPORAL: Para verificar que las variables de entorno se estén cargando
* BORRAR EN PRODUCCIÓN
*/
export default defineEventHandler((event) => {
const runtimeConfig = useRuntimeConfig(event)
return {
oauth: {
authentik: {
clientId: runtimeConfig.oauth.authentik.clientId ? 'SET (hidden)' : 'MISSING',
clientSecret: runtimeConfig.oauth.authentik.clientSecret ? 'SET (hidden)' : 'MISSING',
serverUrl: runtimeConfig.oauth.authentik.serverUrl || 'MISSING',
redirectURL: runtimeConfig.oauth.authentik.redirectURL || 'MISSING',
}
},
public: {
appUrl: runtimeConfig.public.appUrl || 'MISSING'
},
env: {
NODE_ENV: process.env.NODE_ENV,
// Verificar directamente las env vars
NUXT_OAUTH_AUTHENTIK_SERVER_URL: process.env.NUXT_OAUTH_AUTHENTIK_SERVER_URL || 'MISSING',
NUXT_OAUTH_AUTHENTIK_REDIRECT_URL: process.env.NUXT_OAUTH_AUTHENTIK_REDIRECT_URL || 'MISSING',
NUXT_PUBLIC_APP_URL: process.env.NUXT_PUBLIC_APP_URL || 'MISSING',
}
}
})

View File

@@ -1,21 +1,16 @@
/**
* Protected API Endpoint
* Ruta: /api/protected
*
* Endpoint protegido que requiere autenticación
* Retorna datos sensibles solo para usuarios autenticados
* Requires authentication - returns user-specific data
*/
export default defineEventHandler(async (event) => {
// Verificar autenticación
const session = await requireUserSession(event)
return {
message: 'Datos protegidos del usuario',
user: session.user.username,
user: (session.user as any).username,
data: {
// Aquí puedes añadir datos específicos del usuario
lotes: [],
permissions: session.user.groups || []
permissions: (session.user as any).groups || []
},
timestamp: new Date().toISOString()
}

View File

@@ -1,13 +0,0 @@
/**
* Public API Endpoint
* Ruta: /api/public
*
* Endpoint público que no requiere autenticación
* Útil para datos que deben estar disponibles offline
*/
export default defineEventHandler(async (event) => {
return {
message: 'Este endpoint es público y funciona offline',
timestamp: new Date().toISOString()
}
})

View File

@@ -1,15 +0,0 @@
/**
* Get Current User API
* Ruta: /api/user
*
* Endpoint protegido que devuelve la información del usuario autenticado
*/
export default defineEventHandler(async (event) => {
// Obtener sesión del usuario (requiere autenticación)
const session = await requireUserSession(event)
return {
user: session.user,
loggedInAt: session.loggedInAt
}
})