Add flat route files with dot notation
- Add server/routes/auth.authentik.get.ts - Add server/routes/auth.logout.get.ts - Test if dot notation creates nested routes /auth/authentik - Keep auth/ folder as backup
This commit is contained in:
93
nuxt4-app/server/routes/auth.authentik.get.ts
Normal file
93
nuxt4-app/server/routes/auth.authentik.get.ts
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
import { getQuery } from 'h3'
|
||||||
|
import { withQuery } from 'ufo'
|
||||||
|
import { defu } from 'defu'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OAuth Authentik Login Handler
|
||||||
|
* Ruta: /auth/authentik
|
||||||
|
*
|
||||||
|
* Este endpoint inicia el flujo OAuth con Authentik
|
||||||
|
*/
|
||||||
|
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,
|
||||||
|
serverUrl: runtimeConfig.oauth.authentik.serverUrl,
|
||||||
|
redirectURL: runtimeConfig.oauth.authentik.redirectURL,
|
||||||
|
scope: ['openid', 'profile', 'email'],
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('OAuth Authentik - Iniciando flujo:', {
|
||||||
|
serverUrl: config.serverUrl,
|
||||||
|
redirectURL: config.redirectURL,
|
||||||
|
hasCode: !!query.code
|
||||||
|
})
|
||||||
|
|
||||||
|
// Handle OAuth callback
|
||||||
|
if (query.code) {
|
||||||
|
try {
|
||||||
|
// Exchange code for tokens
|
||||||
|
const tokenUrl = `${config.serverUrl}/application/o/token/`
|
||||||
|
const tokenResponse = await $fetch(tokenUrl, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
|
},
|
||||||
|
body: new URLSearchParams({
|
||||||
|
grant_type: 'authorization_code',
|
||||||
|
client_id: config.clientId,
|
||||||
|
client_secret: config.clientSecret,
|
||||||
|
code: query.code as string,
|
||||||
|
redirect_uri: config.redirectURL,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
const tokens = tokenResponse as any
|
||||||
|
|
||||||
|
// Get user info
|
||||||
|
const userInfoUrl = `${config.serverUrl}/application/o/userinfo/`
|
||||||
|
const user = await $fetch(userInfoUrl, {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${tokens.access_token}`,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Guardar información del usuario en la sesión
|
||||||
|
await setUserSession(event, {
|
||||||
|
user: {
|
||||||
|
id: (user as any).sub,
|
||||||
|
email: (user as any).email,
|
||||||
|
name: (user as any).name || (user as any).preferred_username,
|
||||||
|
username: (user as any).preferred_username,
|
||||||
|
picture: (user as any).picture,
|
||||||
|
groups: (user as any).groups || []
|
||||||
|
},
|
||||||
|
loggedInAt: Date.now()
|
||||||
|
})
|
||||||
|
|
||||||
|
// Redirigir al dashboard después del login
|
||||||
|
return sendRedirect(event, '/')
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error('Authentik OAuth error:', error)
|
||||||
|
return sendRedirect(event, '/error?message=auth_failed')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initial redirect to Authentik
|
||||||
|
const authorizationUrl = withQuery(
|
||||||
|
`${config.serverUrl}/application/o/authorize/`,
|
||||||
|
{
|
||||||
|
client_id: config.clientId,
|
||||||
|
redirect_uri: config.redirectURL,
|
||||||
|
response_type: 'code',
|
||||||
|
scope: config.scope.join(' '),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
console.log('Redirecting to:', authorizationUrl)
|
||||||
|
return sendRedirect(event, authorizationUrl)
|
||||||
|
})
|
||||||
10
nuxt4-app/server/routes/auth.logout.get.ts
Normal file
10
nuxt4-app/server/routes/auth.logout.get.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/**
|
||||||
|
* Logout Handler
|
||||||
|
* Ruta: /auth/logout
|
||||||
|
*
|
||||||
|
* Limpia la sesión del usuario y redirige a la página de inicio
|
||||||
|
*/
|
||||||
|
export default defineEventHandler(async (event) => {
|
||||||
|
await clearUserSession(event)
|
||||||
|
return sendRedirect(event, '/')
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user