export default defineEventHandler(async (event) => { const query = getQuery(event); const { code, state } = query; if (!code || !state) { throw createError({ statusCode: 400, statusMessage: 'Missing authorization code or state', }); } // Verify state const storedState = getCookie(event, 'oauth-state'); if (state !== storedState) { throw createError({ statusCode: 400, statusMessage: 'Invalid state parameter', }); } try { const keycloak = createKeycloakClient(); const sessionManager = createSessionManager(); // Exchange code for tokens const tokens = await keycloak.exchangeCodeForTokens(code as string); // Get user info const userInfo = await keycloak.getUserInfo(tokens.access_token); // Create session const sessionData = { user: { id: userInfo.sub, email: userInfo.email, name: userInfo.name || `${userInfo.given_name} ${userInfo.family_name}`.trim(), groups: userInfo.groups || [], tier: userInfo.tier, }, tokens: { accessToken: tokens.access_token, refreshToken: tokens.refresh_token, expiresAt: Date.now() + (tokens.expires_in * 1000), }, createdAt: Date.now(), lastActivity: Date.now(), }; const sessionCookie = sessionManager.createSession(sessionData); // Set session cookie setHeader(event, 'Set-Cookie', sessionCookie); // Clear state cookie deleteCookie(event, 'oauth-state'); return sendRedirect(event, '/dashboard'); } catch (error) { console.error('Auth callback error:', error); throw createError({ statusCode: 500, statusMessage: 'Authentication failed', }); } });