myCRM/OIDC_SETUP.md
olli 9122cd2cc1 feat: Integrate Pocket-ID OIDC for Single Sign-On
- 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
2025-11-08 17:32:39 +01:00

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

  1. Öffnen Sie die Pocket-ID Admin-Oberfläche

  2. 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
  3. 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

  1. Benutzer klickt auf "Mit Pocket-ID anmelden" auf der Login-Seite
  2. Weiterleitung zu Pocket-ID Authorization Endpoint
  3. Benutzer authentifiziert sich bei Pocket-ID
  4. Redirect zurück zu myCRM mit Authorization Code
  5. myCRM tauscht Code gegen Access Token
  6. Benutzer-Informationen werden von Pocket-ID abgerufen
  7. Benutzer wird erstellt (falls neu) oder aktualisiert
  8. 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)
  • lastLoginAt wird 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_URL auf 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 email in 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

  1. PocketIdProvider (src/OAuth/PocketIdProvider.php)

    • Extends League\OAuth2\Client GenericProvider
    • Konfiguriert OIDC-Endpoints
  2. PocketIdResourceOwner (src/OAuth/PocketIdResourceOwner.php)

    • Repräsentiert OIDC User-Informationen
    • Extrahiert Claims (sub, email, name, etc.)
  3. PocketIdAuthenticator (src/Security/PocketIdAuthenticator.php)

    • Symfony Security Authenticator
    • Handhabt OAuth2-Flow
    • Erstellt/aktualisiert Benutzer
  4. OAuthController (src/Controller/OAuthController.php)

    • Start-Endpoint: /connect/pocketid
    • Callback-Endpoint: /connect/pocketid/check

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.

Weitere Informationen