OIDC-Integration: Keycloak-Login (Authorization Code Flow + PKCE), app-seitige Rollen bleiben unangetastet

This commit is contained in:
Kühn
2026-09-15 11:41:29 +02:00
parent 1d03ab498f
commit 1ee37c402a
9 changed files with 420 additions and 6 deletions

View File

@@ -150,4 +150,40 @@ router.get('/me', authMiddleware, (req, res) => {
res.json(req.user);
});
// ============ OpenID Connect (Keycloak) ============
const oidc = require('../oidc');
// Status-Endpoint fürs Frontend: OIDC-Button nur anzeigen, wenn konfiguriert
router.get('/oidc/status', (req, res) => {
res.json({ configured: oidc.isOIDCConfigured() });
});
// Schritt 1: Weiterleitung zu Keycloak (Authorization Code Flow + PKCE)
router.get('/oidc/login', async (req, res) => {
try {
await oidc.startAuthFlow(req, res);
} catch (err) {
console.error('[OIDC] Login-Start fehlgeschlagen:', err.message);
res.status(502).json({ error: 'Anmeldung über OIDC momentan nicht verfügbar.' });
}
});
// Schritt 2: Callback von Keycloak — Code-Tausch, Provisionierung, Session
router.get('/oidc/callback', async (req, res) => {
const appBase = process.env.APP_BASE_URL || '';
try {
await oidc.handleCallback(req, res);
// Erfolgreich: zurück zur App (Frontend übernimmt via /auth/me)
res.redirect(appBase || '/');
} catch (err) {
console.error('[OIDC] Callback-Fehler:', err.message);
auditLog(null, 'oidc.login_failed', null, null, err.message, req);
const status = err.status || 502;
// Dem Nutzer einen verständlichen Fehler zeigen (SPA-Fallback rendert index.html;
// die Meldung geht als Query-Parameter mit und wird vom Login-Formular angezeigt)
const msg = encodeURIComponent(err.message || 'OIDC-Anmeldung fehlgeschlagen.');
res.redirect((appBase || '/') + '?oidcError=' + msg);
}
});
module.exports = router;