====== LU05.A01 - Authentifizierungsservice erstellen ======
Erstelle einen Authentifizierungsservice als RESTful Flask-Applikation.
**[[https://classroom.github.com/a/_7rYg-3J|GitHub Classroom Assignment]]**
===== Umsetzung =====
Für die Umsetzung im Modulunterricht erstellen wir eine RESTful Flask-Applikation.
==== Benutzerkonten ====
Die Benutzerkonten speichern wir als JSON-Objekte in einer Datei.
[
{
"username": "hans@abc.xy",
"password": "addb0f5e7826c857d7376d1bd9bc33c0c544790a2eac96144a8af22b1298c940",
"role": "customer"
},
{
"username": "andrea@abc.xy",
"password": "d14769b181706206c248aadd1c01dbf37568572f9a702a6a92bc2d8d9573a9a5",
"role": "employee"
},
{
"username": "beatrice@abc.xy",
"password": "33c5ebbb01d608c254b3b12413bdb03e46c12797e591770ccf20f5e2819929b2",
"role": "admin"
}
]
Das Passwort ist als SHA-256 Hash gespeichert.
^ Benutzer ^ Passwort ^
| hans@abc.xy | geheim |
| andrea@abc.xy | passWORT |
| beatrice@abc.xy | passwort |
==== Request ====
Der Client sendet einen POST-Request mit dem Benutzernamen und dem Passwort.
=== Service ===
* HTTP-Methode: ''POST''
* Pfad: ''/login''
* Daten:
* ''username''
* ''password''
===== Verarbeitung =====
==== Funktion "post" / "auth_resource.py" ====
- Parse die Argumente aus dem Request.
- Suche den Benutzer anhand des Benutzernamens
- Falls ein Benutzer gefunden wurde
- Falls der SHA256-Hash des übermittelten Passworts mit dem Passwort des Benutzers übereinstimmt:
- Erzeuge ein Token
==== Funktion "_make_token" / "auth_resource.py" ====
Erzeuge ein JSON Web Token mit den Claims:
* ''username'': Benutzername des angemeldeten Benutzers
* ''userrole'': Die Benutzerrolle des angemeldeten Benutzers
* ''exp'': Ablaufdatum / Berechnet aus der aktuellen Zeit und der Gültigkeit in Sekunden (''TOKEN_DURATION'')
==== Response ====
=== Authentifizierung erfolgreich ===
Die Response unseres Services besteht aus dem HTTP-Statuscode "200" und einem JSON Web Token.
Das Token enthält:
* ''exp'': Ablaufzeit des Tokens. Berechnet aus der aktuellen Zeit und der Gültigkeit in Sekunden (''TOKEN_DURATION'')
* ''username'': Benutzername
* ''userrole'': Benutzerrolle
=== Authentifizierung nicht erfolgreich ===
Als Response wird der HTTP-Statuscode ''401'' gesendet.
//=> GitHub Repo für externe Besucher//
GitHub Repository https://github.com/templates-python/m321-lu05-a01-authentication
//Lernende am BZZ müssen den Link zum GitHub Classroom Assignment verwenden//
----
{{tag>M321-LU05}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Marcel Suter