- Added knpuniversity/oauth2-client-bundle and league/oauth2-client to composer.json - Updated composer.lock with new dependencies - Registered KnpUOAuth2ClientBundle in bundles.php - Configured security.yaml for custom authenticator and access control - Created OIDC setup documentation (OIDC_SETUP.md) - Implemented OAuthController for handling Pocket-ID authentication flow - Developed PocketIdProvider and PocketIdResourceOwner for OIDC integration - Created PocketIdAuthenticator for user authentication and management - Updated login.html.twig to include Pocket-ID login button with styling - Added knpu_oauth2_client.yaml configuration for Pocket-ID client
4.7 KiB
Pocket-ID OIDC Integration
Übersicht
myCRM unterstützt nun Single Sign-On (SSO) via Pocket-ID (OpenID Connect).
Konfiguration
1. Pocket-ID Server einrichten
Stellen Sie sicher, dass Ihr Pocket-ID Server läuft (Standard: http://localhost:17170).
2. Client in Pocket-ID registrieren
-
Öffnen Sie die Pocket-ID Admin-Oberfläche
-
Erstellen Sie einen neuen OAuth2/OIDC Client mit folgenden Einstellungen:
- Name: myCRM
- Redirect URI:
http://localhost:8000/connect/pocketid/check - Grant Types: Authorization Code
- Scopes:
openid,profile,email - Response Types:
code
-
Notieren Sie:
- Client ID
- Client Secret
3. Umgebungsvariablen konfigurieren
Bearbeiten Sie .env.local (NICHT .env für Produktionsumgebungen):
# Pocket-ID OIDC Configuration
OAUTH_POCKET_ID_URL=http://localhost:17170
OAUTH_POCKET_ID_CLIENT_ID=<your-client-id>
OAUTH_POCKET_ID_CLIENT_SECRET=<your-client-secret>
OAUTH_POCKET_ID_REDIRECT_URI=http://localhost:8000/connect/pocketid/check
4. Cache leeren
php bin/console cache:clear
Verwendung
Login-Flow
- Benutzer klickt auf "Mit Pocket-ID anmelden" auf der Login-Seite
- Weiterleitung zu Pocket-ID Authorization Endpoint
- Benutzer authentifiziert sich bei Pocket-ID
- Redirect zurück zu myCRM mit Authorization Code
- myCRM tauscht Code gegen Access Token
- Benutzer-Informationen werden von Pocket-ID abgerufen
- Benutzer wird erstellt (falls neu) oder aktualisiert
- Benutzer wird eingeloggt und zum Dashboard weitergeleitet
Automatische Benutzererstellung
Wenn ein Benutzer sich zum ersten Mal mit Pocket-ID anmeldet:
- Ein neuer User-Account wird automatisch erstellt
- E-Mail, Vorname und Nachname werden von Pocket-ID übernommen
- Standard-Rolle:
ROLE_USER - Account ist sofort aktiv
Bestehende Benutzer
Wenn ein Benutzer mit derselben E-Mail-Adresse bereits existiert:
- Vorname und Nachname werden aktualisiert (falls von Pocket-ID bereitgestellt)
lastLoginAtwird aktualisiert- Bestehende Rollen und Berechtigungen bleiben erhalten
Sicherheit
Implementierte Maßnahmen
- ✅ State Parameter zum Schutz vor CSRF-Angriffen
- ✅ TLS/HTTPS für Produktion erforderlich
- ✅ Sichere Token-Validierung
- ✅ Automatische Token-Rotation
- ✅ Session-basierte Authentifizierung nach OIDC-Login
Produktions-Checkliste
- HTTPS aktivieren (
OAUTH_POCKET_ID_URLauf HTTPS-Endpoint ändern) - Redirect URI auf Produktions-URL ändern
- Client Secret sicher speichern (z.B. Symfony Secrets)
- Pocket-ID Server mit TLS/SSL absichern
- Rate Limiting konfigurieren
- Logging für OIDC-Fehler aktivieren
Troubleshooting
"Redirect URI mismatch"
- Überprüfen Sie, dass die Redirect URI in Pocket-ID exakt mit
OAUTH_POCKET_ID_REDIRECT_URIübereinstimmt - Achten Sie auf http vs. https und trailing slashes
"Invalid client credentials"
- Client ID und Secret in
.env.localüberprüfen - Cache leeren:
php bin/console cache:clear
"Email not provided by Pocket-ID"
- Stellen Sie sicher, dass der Scope
emailin der Pocket-ID Client-Konfiguration aktiviert ist - Überprüfen Sie, dass der Benutzer in Pocket-ID eine E-Mail-Adresse hinterlegt hat
Benutzer kann sich nicht anmelden
- Überprüfen Sie Symfony-Logs:
var/log/dev.log - Aktivieren Sie Debug-Logging im
PocketIdAuthenticator - Prüfen Sie die Pocket-ID Server-Logs
Architektur
Komponenten
-
PocketIdProvider (
src/OAuth/PocketIdProvider.php)- Extends League\OAuth2\Client GenericProvider
- Konfiguriert OIDC-Endpoints
-
PocketIdResourceOwner (
src/OAuth/PocketIdResourceOwner.php)- Repräsentiert OIDC User-Informationen
- Extrahiert Claims (sub, email, name, etc.)
-
PocketIdAuthenticator (
src/Security/PocketIdAuthenticator.php)- Symfony Security Authenticator
- Handhabt OAuth2-Flow
- Erstellt/aktualisiert Benutzer
-
OAuthController (
src/Controller/OAuthController.php)- Start-Endpoint:
/connect/pocketid - Callback-Endpoint:
/connect/pocketid/check
- Start-Endpoint:
OIDC-Flow
User → myCRM → Pocket-ID (Authorization) → User authenticates
← Redirect with code ←
→ Exchange code for token →
← Access Token + ID Token ←
→ Fetch user info →
← User claims ←
User logged in
Alternative Authentifizierung
Die traditionelle Login-Methode (E-Mail + Passwort) bleibt weiterhin verfügbar und kann parallel zu OIDC verwendet werden.