PPNP Game – Login-Brücke
Das Modul stellt eingeloggten Nutzern ein kurzlebiges, signiertes JWT aus, mit dem sich der separate Node.js-Spieldienst (ppnp.weinify.de/game) authentifiziert. Es gibt keinen eigenen Login-Nachbau – der Node-Dienst prüft nur die Signatur und vertraut WordPress als Identitätsquelle.
Allgemein
Spielstart per Button
Ein Shortcode zeigt einen „Spiel starten“-Button für eingeloggte, freigeschaltete Nutzer. Ein Klick holt per AJAX ein frisch signiertes Token und leitet direkt zum Node.js-Spieldienst weiter, der das Token aus dem URL-Fragment liest.
Drei getrennte Spiel-Berechtigungen
Neben der reinen Spielfreigabe (view-Recht über die normale Modulberechtigung) gibt es drei eigene, im Nutzerprofil einzeln vergebbare Capabilities: Stammdaten pflegen (Typen, Attacken, Pyxlinge), neue Welten erstellen und den Beta-Bereich verwalten. Editoren und Administratoren erhalten die ersten beiden automatisch über ihre Rolle, die Beta-Berechtigung bewusst nur Administratoren.
Spielerliste für den Node-Dienst
Der Node-Dienst kann per authentifiziertem Callback die vollständige Liste aller fürs Spiel freigeschalteten Nutzer abrufen – Grundlage für die Spieler-Zuweisung pro Welt im Spieldienst selbst.
Shortcodes
Shortcode Beschreibung weinhold_ppnp_game_launch Button für eingeloggte, freigeschaltete Nutzer, der ein signiertes Spiel-Login-Token holt und zum Node.js-Spiel weiterleitet. Keine Parameter
Dateien
modules/ppnp_game_auth.php – einzige Datei des Moduls: Capability-Verwaltung, JWT-Signierung, AJAX-Endpunkte (Token-Ausstellung, Spielerliste), Shortcode, Admin-Statusseite, Cleanup.
Für Entwickler
Kein eigener Datenbank-State
Anders als fast alle anderen Module gibt es kein maybe_install() und keine eigene Tabelle: Das Modul signiert bei jedem Aufruf nur ein kurzlebiges Token aus bereits vorhandenen WordPress-Nutzerdaten. weinhold_ppnp_game_auth_cleanup() existiert trotzdem, weil die drei Capabilities echter, dauerhafter State sind, der beim Zurücksetzen sauber von allen Rollen UND individuell zugewiesenen Nutzern entfernt werden muss.
Selbst gebautes HS256-JWT ohne Bibliothek
weinhold_ppnp_game_auth_sign_token() baut das JWT von Hand (Base64url-Encoding, HMAC-SHA256-Signatur über hash_hmac()) statt eine Composer-Bibliothek einzubinden – der Node-Dienst validiert nur die Signatur mit demselben Secret (PPNP_GAME_JWT_SECRET aus der wp-config.php), es findet keine eigene Session-Verwaltung im Spieldienst statt. Das Token trägt neben der Nutzer-ID auch die drei Capability-Flags direkt im Payload und läuft nach 120 Sekunden ab – bewusst nur als kurzlebiges Sprungbrett zum Aufbau der WebSocket-Verbindung gedacht, nicht als dauerhaftes Zugangs-Credential.
Server-zu-Server per Shared Secret
Der Callback für die Spielerliste läuft über einen nopriv-Ajax-Hook (der Node-Dienst hat keine WordPress-Session) und wird stattdessen über ein zweites, vom JWT-Secret getrenntes Shared Secret abgesichert (Header X-PPNP-Game-Secret, Konstante PPNP_GAME_API_SECRET, Vergleich per hash_equals() gegen Timing-Angriffe). Die Freigabeprüfung nutzt exakt dieselbe Funktion wie beim Token-Ausstellen, damit „wer darf spielen“ nur eine einzige Quelle der Wahrheit hat.
Zwei komplett getrennte Secrets für zwei komplett getrennte Zwecke: PPNP_GAME_JWT_SECRET signiert Nutzer-Tokens, PPNP_GAME_API_SECRET schützt den Server-zu-Server-Callback – ein kompromittiertes Secret legt nie beide Kanäle gleichzeitig offen. Die Beta-Berechtigung wird absichtlich NICHT wie die anderen beiden Capabilities automatisch an Editoren vergeben, obwohl der Code dafür identisch aufgebaut ist – reine Vorsichtsmaßnahme, damit ein unfertiger Beta-Bereich nicht versehentlich für alle Spielleiter sichtbar wird.Besonderheiten
Dieses Modul ist das dokumentierte Vorbild für den MCP-Server-Manager: Beide nutzen signierte Tokens, ein zweites Shared Secret für Server-zu-Server-Calls und Capability-basierte statt tabellenbasierte Zugriffsrechte. Der MCP Server Manager weicht bewusst in zwei Punkten ab (dynamische statt fester Capabilities, langlebige statt kurzlebige Tokens) – wer den Aufbau des einen Moduls versteht, erkennt die Struktur des anderen sofort wieder.
Versionshistorie
Version Datum Änderung 1.0.0 22.09.2026 Einführung der Versionierung.