Lösungsvorschlag: einfache token-basierte Webanwendung
Ziemlich raffiniert, aber funktioniert
Es gibt noch viel zu tun, um diese etwas tradierte Website fertigzustellen, aber für eine kurze Demo reicht es.
Der Quellcode befindet sich auf auf GitHub:https://github.com/ateachment/SimpleAuthService/tree/token-based
Authentifizierung
Wie bereits in Lösung: SimpleAuthService mit Datenbank gezeigt, erfolgt die Authentifizierung durch eine Anmeldung mit Benutzername und Kennwort gegen eine Datenbank:

Authentifizierung gegen die Datenbank
Funktionsweise
Die Flask-Datei simpleAuthService.py ist als kleine Webanwendung monolithisch ausgeführt und besteht daher aus zwei Teilen:
1. User Interface mit API-Gateway
Das UI besteht aus 3 Webseiten:
/template/dashboard.html
/template/login.html
/tempate/todo.html
Die Template-Struktur ist oben bereits abgebildet: und
login.htmldashboard.html erweitern index.html. erbt weiter alles von Template dashboard.html
todo.html
Login ruft mit POST das Anmeldeformular auf oder (bei gültigem Token) mit GET direkt das Dashboard
(@app.route("/") mit der Funktion index())
Dashboard "rendert" das Dashboard.
(@app.route("/dashboard") mit der Funktion dashboard())
Logout meldet den angemeldeten Benutzer (Token wird ungültig gemacht) und ruft wieder das Anmeldeformular auf.
(@app.route("/logout") mit der Funktion logout())
Läuft die Zeit des Tokens ab, wird ein Logout vorgenommen und mit GET wieder das das Anmeldeformular angezeigt.
2. Mikroservice
loginUser() meldet einen Benutzer an, in dem Benutzername und Kennwort in der Datenbank abgefragt werden. Bei Erfolg wird ein gültiges Token generiert und in der Datenbank beim Benutzer gespeichert und mit dem Statuscode 200 zurückgegeben. Im Fehlerfall wird das ungültige Token -1 erzeugt, gespeichert und mit dem Statuscode 403 forbidden zurückgegeben.
@app.route('/auth/user/login', methods=['POST'])
logoutUser() meldet einen Benutzer ab, indem das übergebene Token in der Datenbank auf -1 gesetzt und so zurückgegeben wird.
@app.route('/auth/user/<token>', methods=['DELETE'])
autorize() aktualisiert den Zeitstempel eines gültigen Tokens und verlängert damit die Gültigkeit (um 10 Sekunden) oder
@app.route('/auth/user/roles/<token>', methods=['GET'])
Zusammenfassung
Die Nachteile dieses konventionellen Ansatzes sind:
- Um das eigentlich zustandslose HTTP-Protokoll dazu zu bringen, die Zustände "angemeldet" und "abgemeldet" zu verstehen, muss eine ganze Menge Arbeit geleistet werden. So wird beispielsweise bei jeder Anfrage eine Datenbankabfrage durchgeführt, um festzustellen, ob die aktuelle Sitzungsnummer noch gültig ist und welche Rollen der Benutzer innehat. Diese Webanwendung ist also insgesamt recht "geschwätzig".
- Die SessionID kann gestohlen werden.