OIDC-Integration: Keycloak-Login (Authorization Code Flow + PKCE), app-seitige Rollen bleiben unangetastet
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user