# M365 Login für WordPress Ein schlankes, sicherheitsorientiertes WordPress-Plugin, das einen **„Login mit Microsoft“-Button** auf die Anmeldeseite (`wp-login.php`) setzt. Bestehende WordPress-Benutzer melden sich mit ihrem Microsoft 365 / Entra-ID-Konto an. Der gemeinsame Schlüssel ist die **E-Mail-Adresse** – es werden keine Benutzer angelegt. > Plugin-Slug / Text Domain: `m365-login` · Lizenz: GPL-2.0-or-later · PHP ≥ 7.4 · WordPress ≥ 6.0 ## Funktionen - **Button auf der Login-Seite** – Text, Icon (Microsoft-Logo oder eigenes Bild aus der Mediathek), Hintergrund-, Hover-, Text- und Rahmenfarbe, Eckenradius und Position (über/unter dem Formular) sind im Backend einstellbar, mit Live-Vorschau und Farb-Presets. - **Aufgeräumte Einstellungsseite** unter *Einstellungen → M365 Login* mit Redirect-URI zum Kopieren, Tenant-Verbindungstest und 5-Schritte-Anleitung. - **Kein Provisioning**: Anmeldung nur, wenn ein WordPress-Benutzer mit derselben E-Mail-Adresse existiert. - **Shortcode** `[m365_login_button redirect="/mein-konto/"]` für eigene Login-Seiten. - Vollständig übersetzbar, deutsche Übersetzung enthalten. ## Sicherheit | Maßnahme | Umsetzung | | --- | --- | | Authorization Code Flow **mit PKCE (S256)** | Tokens laufen ausschließlich Server-zu-Server, nie durch den Browser. | | **State & Nonce** | Einmalig, 10 Minuten gültig, per HttpOnly/SameSite-Cookie an den Browser gebunden (CSRF-/Replay-Schutz, verhindert Login-CSRF). | | **ID-Token-Prüfung** | Signatur gegen Microsofts JWKS (RS256, Schlüssel-Rollover wird abgefangen), Issuer, Audience, Tenant, `exp`/`nbf`/`iat`, Nonce. `alg=none`/HMAC werden abgelehnt. | | **Tenant-Pinning** | Bei konfigurierter Tenant-GUID werden Tokens anderer Tenants abgewiesen. | | **Konto-Bindung** | Beim ersten Login wird die unveränderliche Microsoft-Objekt-ID am Benutzer gespeichert; spätere Logins mit gleicher E-Mail, aber anderer Identität werden abgelehnt. | | **Domain-Allowlist** | Optional nur bestimmte E-Mail-Domains zulassen. | | **Client Secret verschlüsselt** | AES-256-GCM, Schlüssel aus den WordPress-Salts abgeleitet; wird nie wieder angezeigt. | | **WordPress-Standards** | Capability-Checks, Nonces, Sanitizing aller Eingaben, Escaping aller Ausgaben, `wp_safe_redirect`, keine externen Assets. | ## Installation & Einrichtung 1. Ordner in `wp-content/plugins/` legen (oder ZIP aus `bin/build-zip.sh` hochladen) und aktivieren. 2. *Einstellungen → M365 Login* öffnen und die **Redirect-URI** aus der Seitenleiste kopieren (`https://deine-seite.tld/m365-login/callback`). 3. Im [Microsoft Entra Admin Center](https://entra.microsoft.com/) → **App-Registrierungen → Neue Registrierung**: - Name frei wählbar, z. B. „WordPress Login“. - Kontotypen: *Nur Konten in diesem Organisationsverzeichnis* (Single Tenant). - Plattform **Web**, Redirect-URI einfügen. 4. Auf der Übersichtsseite **Anwendungs-ID (Client)** und **Verzeichnis-ID (Mandant)** kopieren und im Plugin eintragen. 5. **Zertifikate & Geheimnisse → Neuer geheimer Clientschlüssel** – den *Wert* (nicht die ID) ins Plugin eintragen. Ablaufdatum notieren; abgelaufene Secrets müssen erneuert werden. 6. **Tokenkonfiguration → Optionalen Anspruch hinzufügen → ID → `email`** (empfohlen). Die delegierten Berechtigungen `openid`, `profile`, `email` sind standardmäßig vorhanden. 7. Speichern. Der Button erscheint auf `wp-login.php`; Gestaltung im Tab **Button**. Stelle sicher, dass die E-Mail-Adressen der WordPress-Benutzer mit denen in Microsoft 365 übereinstimmen. ## Entwickler-Hooks ```php // Button z. B. nur für eine bestimmte Domain anzeigen add_filter( 'm365_login_show_button', fn( $show ) => $show && 'intranet.example.com' === $_SERVER['HTTP_HOST'] ); // domain_hint an Microsoft senden add_filter( 'm365_login_authorize_params', function ( $params ) { $params['domain_hint'] = 'contoso.com'; return $params; } ); // Login zusätzlich anhand der Claims verbieten (z. B. Gruppenmitgliedschaft) add_filter( 'm365_login_allow_user', function ( $allowed, WP_User $user, array $claims ) { return $allowed && ! empty( $claims['groups'] ); }, 10, 3 ); add_action( 'm365_login_success', function ( WP_User $user, array $claims ) { // z. B. Anzeigenamen synchronisieren }, 10, 2 ); ``` Weitere: `m365_login_match_email` (E-Mail vor dem Lookup anpassen). ## Entwicklung ```bash composer install # PHPCS + WordPress Coding Standards composer lint # php -l über alle Dateien composer phpcs # Coding-Standards-Prüfung bash bin/build-zip.sh # build/m365-login.zip für Upload/Einreichung python3 bin/compile-mo.py # languages/*.po → *.mo ``` Die GitHub-Actions-Pipeline (`.github/workflows/ci.yml`) führt Syntax-Check (PHP 7.4–8.4), PHPCS und den offiziellen **WordPress Plugin Check** aus. ## Einreichung bei WordPress.org Siehe [docs/wordpress-org-einreichung.md](docs/wordpress-org-einreichung.md) für die vollständige Checkliste. ## Lizenz GPL-2.0-or-later – siehe [LICENSE](LICENSE).