SSO mit nginx im Eigenbau

Veröffentlicht am

Dieses Tutorial soll dabei helfen ein simples und rudimentäres SSO-System zu implementieren, bei dem nginx selbst die Authentifizierung übernimmt, hierbei ist der Login nur einmal für verschiedene Anwendungen möglich.

Vorraussetzungen

Für das Tutorial benötigst du PHP 7+ sowie nginx mit aktivierem Auth Modul

Login-System mit PHP vorbereiten

Zuerst benötigen wir eine öffentlich erreichbare Domain zum Login. Ich habe mich hierbei für folgende Struktur entschieden:

public_html                                Document root
    |--- www                               Website root
          |--- index.php                   Einstiegspunkt
    |--- access_denied.php                 Fehler bei unzureichender Berechtigungen
    |--- change_password.php               Self-Service zur Passwortänderung
    |--- headless_check.php                Check für Nginx Loginstatus
    |--- login.php                         Login-Formular und Logik
    |--- logout.php                        Logout und deren Logik
    |--- util.php                          Hilfsfunktionen

util.php

Zuerst einmal die Hilfsfunktionsdummies:

access_denied.php

Diese Datei kann nach komplett eigen gestaltet werden, hier reicht eine statische Seite im Normalfall aus.

headless_check.php

Diese Datei wird aufgerufen, wenn nginx den Loginstatus abrpüft, hierbei muss entsprechend ein 403 - Access Denied, 200 - für Login ok und 401 für nicht angemeldet zurückgegeben werden. Ein optionaler Gruppencheck wird über den X-Groups-Header veranlasst der mit Komma getrennt die unterschiedlichen Gruppennamen enthält.

login.php und logout.php

Diese beiden Seiten können grundsätzlich auch komplett eigen gestalet werden, sie werden entsprechend über die index.php aufgerufen.

Login

Hier muss entsprechend die Hilfsfunkion für die Authentifizierung aufgerufen werden und somit der Loginstatus gesetzt. Hier kann auch entsprechend eine Zurückleitung auf die vorherige Seite erfolgen.
Für den Loginstatus werden entsprechend folgende Werte aus $_SESSION berücksichtigt:

Key Inhalt
sso_loggedIn true/false je nach Loginstatus
sso_userInfo Assoziatives Array mit Benutzerinformationen

Logout

Hier genügt der Aufruf von session_destroy(); und entsprechende Benachrichtigung des Benutzers oder deren Umleitung zurück zum Login, je nach Bedarf.

change_password.php

Diese Datei enthält Formular und Logik für den Self-Service zum Ändern von Passwörtern. Ein entsprechender Check ob der Nutzer bereits angemeldet ist oder nicht, muss bei der aktuellen Version selbst abgeprüft werden.

Nginx konfigurieren

Bei der Konfiguration von nginx empfiehlt es sich die Konfiguration für nginx in eine eigene Config-Datei auszulagern und diese entsprechend einzubinden.
Im folgendenen habe ich deshalb die SSO Config in sso.conf eingetragen:

Dieses Snippet passiert dabei darauf, das vorher falls nötig die Variable $groups gesetzt wird. Falls diese vorher nicht gesetzt wird ist diese auf einem leeren String festgelegt. {{SSO_URL}} sollte hierbei durch die entsprechende Addresse zum SSO ersetzt wird. Idealerweise auf einer Subdomain wie bspw. sso.example.com.

In einer entsprechenden nginx Config z. B. die Gruppe dev zu erzwingen:

set $groups dev;
include /home/admin/conf/web/sso.conf;

Conclusion

Das Tutorial stellt natürlich einen möglichen und zugegebenermaßen sehr rudimentären Ansatz dar ein SSO-System zu erstellen.
Es eignet sich hierbei auch nicht für extreme Anwendungsfälle oder Anwendungen die intensiv skalieren müssen.
Da die Beispiele aus einer von mir aktuell im Einsatz stammenden Lösung stammen können evtl. Konfigurationskombinationen nicht funktionieren.
Sollte dies der Fall sein oder anderweitig Fragen auftreten, gerne einen Kommentar verfassen oder mir eine Mail an [email protected] schicken.

Du hast einen Rechtschreib- oder Syntaxfehler gefunden? - Immer her damit ;)