Previously, the Dockerfile tried to copy the instance/ directory which is gitignored and doesn't exist in fresh clones. This caused deployment to fail with "instance/: not found" error. Changes: - Add docker-entrypoint.sh script to auto-generate JWT keys if missing - Install openssl in container for key generation - Remove COPY instance/ from Dockerfile (no longer needed) - Create instance/ directory during build - Set ENTRYPOINT to run initialization script before starting Gunicorn This allows the application to deploy successfully on fresh clones without requiring manual JWT key generation. Fixes deployment issue on production servers. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
OpenID Connect (OIDC) Identity Provider
Ein produktionsbereiter OIDC Identity Provider (IdP) in Flask, konzipiert für Homelab- und Self-Hosting-Umgebungen. Bietet eine vollständige, datenbankgestützte Implementierung des OIDC Authorization Code Flows mit PostgreSQL, erweiterter Benutzerverwaltung und Docker-basiertem Deployment.
Features
- OIDC Authorization Code Flow: Vollständige und standardkonforme Implementierung.
- Datenbank-basiert: PostgreSQL für die Produktion, SQLite für die Entwicklung.
- Produktionsreif:
- Docker-Deployment:
docker-composefür einfaches Setup von Server und Datenbank. - Environment-Konfiguration: Sichere Verwaltung von Secrets und Konfiguration über
.env-Dateien. - WSGI Server: Gunicorn für robusten Betrieb im Docker-Container.
- Datenbank-Migrationen: Schema-Änderungen werden mit Flask-Migrate (Alembic) verwaltet.
- Docker-Deployment:
- Sicherheit:
- bcrypt-Hashing: Sicherer-Algorithmus zum Speichern von Passwörtern.
- Rate Limiting: Schutz vor Brute-Force-Angriffen auf kritischen Endpoints.
- Audit Logging: Detaillierte Protokollierung sicherheitsrelevanter Aktionen.
- Benutzer- und Admin-Verwaltung:
- Admin-Dashboard: Umfassende Weboberfläche zur Verwaltung von Benutzern, Rollen und Berechtigungen.
- Self-Service: Benutzer können sich registrieren und ihr Passwort ändern.
- Rollen & Berechtigungen: Flexibles System zur Zugriffssteuerung.
- Multi-Client-Unterstützung: Verwaltung mehrerer OIDC-Clients über das Admin-Dashboard.
- Monitoring:
- Health Check:
/health-Endpoint zur Überwachung des Dienststatus.
- Health Check:
Technologie-Stack
- Backend: Flask
- Datenbank: PostgreSQL (Produktion), SQLite (Entwicklung)
- Deployment: Docker, Docker Compose
- WSGI Server: Gunicorn
- Bibliotheken: Flask-SQLAlchemy, Flask-Limiter, PyJWT, python-dotenv, Flask-Migrate
Schnellstart (Docker)
Dieser IdP ist für den Betrieb in Docker optimiert.
1. Konfiguration vorbereiten
Kopieren Sie die Produktions-Konfigurationsvorlage. Alle notwendigen Secrets werden automatisch generiert.
cp .env.production .env
Passen Sie die Konfiguration in der .env-Datei an. Das Wichtigste ist, den OIDC_ISSUER auf Ihre öffentliche URL zu setzen.
# Öffnen Sie die .env Datei mit einem Editor
nano .env
# Passen Sie diese Zeile an Ihre Domain an:
# Beispiel: OIDC_ISSUER=https://auth.deine-domain.de
OIDC_ISSUER=https://auth.example.com
2. Server starten
Starten Sie den OIDC-Server und die PostgreSQL-Datenbank mit docker-compose.
# Startet die Dienste im Hintergrund und baut die Images falls notwendig
./deploy.sh
Der Server ist jetzt unter http://localhost:5000 erreichbar (oder unter dem konfigurierten Port).
3. Admin-Passwort ändern (WICHTIG!)
Nach dem ersten Start müssen Sie sofort das Standard-Admin-Passwort ändern.
- Öffnen Sie
http://localhost:5000/admin/loginin Ihrem Browser. - Loggen Sie sich ein mit:
- Benutzername:
admin - Passwort:
admin123
- Benutzername:
- Navigieren Sie zur Benutzerverwaltung, wählen Sie den
admin-Benutzer und vergeben Sie ein neues, sicheres Passwort.
OIDC Endpoints
- Discovery Document:
/.well-known/openid-configuration - Authorization Endpoint:
/authorize - Token Endpoint:
/token - UserInfo Endpoint:
/userinfo
Lokale Entwicklung (ohne Docker)
Für Entwicklungszwecke kann der Server auch direkt ohne Docker gestartet werden.
1. Installation
# Virtuelle Umgebung erstellen und aktivieren
python3 -m venv venv
source venv/bin/activate
# Dependencies installieren
pip install -r requirements.txt
2. Konfiguration
Stellen Sie sicher, dass die FLASK_ENV Umgebungsvariable auf development gesetzt ist (oder nicht gesetzt ist), damit die SQLite-Datenbank verwendet wird.
export FLASK_APP=oidc_server.py
export FLASK_ENV=development
3. Datenbank initialisieren
Für eine neue Datenbank müssen Sie die Migrationen anwenden:
# Erstellt die Datenbank und wendet alle Migrationen an
flask db upgrade
# Füllt die Datenbank mit initialen Test-Benutzern
flask seed
4. Server starten
# Server starten
flask run
Der Server läuft auf http://localhost:5000.
Datenbank-Migrationen
Schema-Änderungen werden mit Flask-Migrate verwaltet.
Workflow für Schema-Änderungen:
- Modelle ändern: Passen Sie die Modelle in
models.pyan. - Migration erstellen: Generieren Sie eine neue Migrations-Datei.
flask db migrate -m "Beschreibung der Änderungen" - Migration anwenden: Wenden Sie die Änderungen auf die Datenbank an.
flask db upgrade
Konfiguration
Die gesamte Konfiguration wird über die .env-Datei gesteuert. Eine detaillierte Vorlage finden Sie in .env.example.
| Variable | Beschreibung | Standardwert (Dev) |
|---|---|---|
FLASK_ENV |
development oder production. Steuert, welche Config geladen wird. |
development |
OIDC_ISSUER |
Die öffentliche URL des IdP. Muss für die Produktion gesetzt werden. | http://localhost:5000 |
SECRET_KEY |
Geheimer Schlüssel für die Flask-Session. | dev-secret-key... |
DATABASE_URL |
Verbindungs-URL für die Datenbank (für PostgreSQL in Produktion). | sqlite:///oidc.db |
ACCESS_TOKEN_LIFETIME |
Gültigkeitsdauer für Access Tokens in Sekunden. | 3600 (1h) |
Sicherheit
- Passwörter: Werden ausschließlich als
bcrypt-Hash gespeichert. - Rate Limiting: Die Endpoints
/login,/admin/loginund/tokensind gegen Brute-Force-Angriffe durch einen Rate Limiter geschützt. - Audit Log: Kritische Aktionen wie Login-Versuche (erfolgreich/fehlgeschlagen) und administrative Änderungen an Benutzern werden in der
audit_logs-Tabelle protokolliert. - Asymmetric Token Signing (RS256): ID Tokens werden mit dem
RS256-Algorithmus signiert. Der Public Key zur Validierung ist über den/jwks-Endpoint verfügbar. - Keine Secrets im Code: Alle sensiblen Daten werden über Umgebungsvariablen aus der
.env-Datei geladen.
Dokumentation
Für Anwendungs-Entwickler (OIDC Integration)
Sie möchten Ihre Anwendung mit diesem OIDC Provider verbinden?
- Quick Start Guide ⚡ - In 10 Minuten integriert (Python, Node.js, PHP Beispiele)
- API Integration Guide 📚 - Vollständige API-Dokumentation und OIDC-Flow
Für System-Administratoren (Deployment)
Sie möchten den OIDC Provider selbst hosten?
- Deployment Guide 🚀 - Anleitung für Entwicklungs- und Produktionsumgebungen
- Production Readiness ✅ - Produktions-Checkliste
Für Projekt-Entwickler (Code-Beiträge)
Sie möchten am Provider selbst entwickeln?
- Architecture 🏗️ - System-Architektur und Design-Entscheidungen
- Testing Guide 🧪 - Anleitung zum Testen der Anwendung
- Python Quick Start Guide 📖 - Best Practices für Python API-Entwicklung
- TODO & Roadmap 📋 - Geplante Features und Verbesserungen
Nächste Schritte
Die folgenden wichtigen Features sind in Entwicklung:
- Refresh Tokens: Für eine verbesserte User Experience ohne häufige Logins.
- PKCE Support: Für sichere Public Clients (SPAs, Mobile Apps)
Eine vollständige Liste finden Sie in docs/TODO.md.