Lösung: Dummy eines Microservice zur Authentifizierung
Completion requirements
Flask-Datei: simpleAuthService.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
from flask import Flask, request import json # make cross-origin AJAX possible because of using swagger editor # https://flask-cors.readthedocs.io/en/latest/#using-json-with-cors from flask_cors import CORS, cross_origin app = Flask(__name__) CORS(app) # make cross-origin AJAX possible @app.route('/auth/user/login', methods=['POST']) def loginUser(): content_type = request.headers.get('Content-Type') if content_type == 'application/json': print(request) username = request.json['username'] password = request.json['password'] elif (content_type == 'application/x-www-form-urlencoded'): # regular html form data username = request.form['username'] password = request.form['password'] else: return 'Content-Type not supported: ' + content_type, 400 # Bad request if username == "testUser" and password == "testPwd": # Everything is OK return "{ \"token\": \"123456\" }" # JavaScript JSON parse don’t support single quote. else: return "{ \"token\": \"-1\" }", 403 # Forbidden @app.route('/auth/user/<token>', methods=['DELETE']) def logoutUser(token): return "{ \"token\": \"-1\" }" # 200 logout sucessful if __name__ == '__main__': app.run() |
Pytest-Datei: testSimpleAuthService.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | import pytest import json from simpleAuthService import app def test_login_json_sucess(): data = { "username": "testUser", "password": "testPwd" } response = app.test_client().post('/auth/user/login', json=data) assert response.status_code == 200 token = json.loads(response.data.decode('utf-8')).get("token") assert token == '123456' def test_login_json_fail(): data = { "username": "testUser", "password": "testWrongPwd" } response = app.test_client().post('/auth/user/login', json=data) assert response.status_code == 403 token = json.loads(response.data.decode('utf-8')).get("token") assert token == '-1' def test_login_form_success(): data = "username=testUser&password=testPwd" headers = {'Content-Type': 'application/x-www-form-urlencoded'} response = app.test_client().post('/auth/user/login', data=data, headers=headers) assert response.status_code == 200 token = json.loads(response.data.decode('utf-8')).get("token") assert token == '123456' def test_logout(): response = app.test_client().delete('/auth/user/123456') assert response.status_code == 200 token = json.loads(response.data.decode('utf-8')).get("token") assert token == '-1' |
HTML-Datei: index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Login/Logout Form</title> <script> var token = "-1"; function login () { // post form data // var formData = new FormData(document.getElementById("myForm")); // lazy but short // data = JSON.stringify(Object.fromEntries(formData.entries())) var formData = new FormData(); formData.append("username", document.getElementById("username").value); formData.append("password", document.getElementById("password").value); data = JSON.stringify(Object.fromEntries(formData.entries())) // fetch post fetch("http://localhost:5000/auth/user/login", { method: "POST", headers: { 'Content-Type': 'application/json' }, body: data }) // return server response as text .then((result) => { if (result.status != 200 && result.status != 403) //if not logged and if not wrong username/pwd throw Error(result.statusText); else return result.text(); }) // output response .then((response) => { console.log(response); const obj = JSON.parse(response); // JavaScript JSON parse don’t support single quote. document.getElementById("response").innerHTML = "Token = " + obj.token token = obj.token }) // error handling .catch((error) => { console.log(error); alert("Oops! Something went wrong!") }); } function logout () { // get with path data fetch("http://localhost:5000/auth/user/" + token, { method: "DELETE", headers: { 'Content-Type': 'application/json' } }) // return server response as text .then((result) => { if (result.status != 200) //if not OK throw Error(result.statusText); else return result.text(); }) // output response .then((response) => { console.log(response); const obj = JSON.parse(response); // JavaScript JSON parse don’t support single quote. document.getElementById("response").innerHTML = "Token = " + obj.token }) // error handling .catch((error) => { console.log(error); alert("Oops! Something went wrong!") }); } </script> </head> <body> <form id="myForm" action = "http://localhost:5000/auth/user/login" method = "post"> <p>Enter Name:</p> <p><input id='username' type = "text" name = "username" value="testUser"/></p> <p>Enter Password:</p> <p><input id='password' type = "password" name = "password" value="testPwd"/></p> <p><input type = "submit" value = "Login" /> </form> <button onclick="return login()">Login with JavaScript</button><button onclick="return logout()">Logout with JavaScript</button> <div id="response"></div> </body> </html> |
Quellcode auf GitHub:
https://github.com/ateachment/SimpleAuthService/tree/develop-dummy
Last modified: Sunday, 20 November 2022, 2:37 PM