Auth-Schicht vorbereitet — Dev-Modus (KEYCLOAK_URL leer) lässt alles
durch, Prod-Modus (ENV gesetzt) validiert JWT gegen Keycloak-JWKS.
Backend (app/auth.py):
- JWKS-Cache mit 1h TTL (async httpx fetch)
- get_current_user: Optional, gibt User-Dict oder None
- require_auth: Pflicht, gibt User-Dict oder HTTP 401
- keycloak_login_url: Baut die OIDC-Login-URL
- _is_auth_enabled: prüft ob alle 3 ENV-Vars gesetzt sind
Abgesicherte POST-Endpoints:
- POST /analyze → Depends(require_auth)
- POST /api/analyze-drucksache → Depends(require_auth)
- POST /api/programme/index → Depends(require_auth)
Neue Endpoints:
- GET /api/auth/me → {authenticated, sub, email, name, roles} oder {authenticated: false}
- GET /api/auth/login-url → {enabled, url} für Keycloak-Redirect
Frontend (index.html):
- initAuth() beim DOMContentLoaded → prüft /api/auth/me
- "Anmelden"-Button im Header (neben "Quellen")
- "Jetzt prüfen"-Button: disabled + Tooltip "Nur nach Anmeldung
verfügbar" wenn nicht eingeloggt; aktiv wenn eingeloggt
- currentUser-State steuert Button-Zustände
Dev-Modus: Solange KEYCLOAK_URL nicht gesetzt ist (lokale Dev, aktueller
Prod-Stand), sind alle Endpoints offen wie bisher. Kein Breaking Change.
Dependency: python-jose[cryptography]>=3.3.0 in requirements.txt.
Tests: 194/194 grün (auth.py hat keine Seiteneffekte im Import).
Refs: #43
16 lines
315 B
Plaintext
16 lines
315 B
Plaintext
fastapi>=0.115.0,<0.116.0
|
|
starlette>=0.38.0,<0.42.0
|
|
uvicorn[standard]>=0.30.0
|
|
jinja2>=3.1.0,<3.1.6
|
|
python-multipart>=0.0.9
|
|
pymupdf>=1.24.0
|
|
openai>=1.50.0
|
|
aiosqlite>=0.20.0
|
|
httpx>=0.27.0
|
|
beautifulsoup4>=4.12.0
|
|
weasyprint>=62.0
|
|
pydantic>=2.9.0
|
|
pydantic-settings>=2.5.0
|
|
slowapi>=0.1.9
|
|
python-jose[cryptography]>=3.3.0
|