Oktatóanyag: Bejelentkezés hozzáadása Python Flask-webalkalmazáshoz
Ez az oktatóanyag egy oktatóanyag-sorozat harmadik része, amely bemutatja, hogy a Python Flask-webalkalmazások az alapoktól kezdve épülnek fel, és integrálják a hitelesítést a Microsoft Identitásplatform használatával. Ebben az oktatóanyagban kódot ad hozzá a felhasználók hitelesítéséhez a létrehozott alkalmazásban.
- A szükséges modulok és konfiguráció importálása
- Flask-webalkalmazás példányának létrehozása
- ProxyFix köztes szoftver konfigurálása helyi fejlesztéshez
- Kód hozzáadása a bejelentkezéshez és a felhasználók kijelentkezéséhez
- Belépési pont meghatározása a webalkalmazáshoz
Szükséges csomagok és konfigurációk importálása
Az éppen létrehozott webalkalmazás az MSAL Pythonra épülő csomagot használja a identity.web
webalkalmazások felhasználóinak hitelesítéséhez. A csomag, a Flask-keretrendszer, a identity.web
Flask-modulok, a Flask-munkamenet és az előző oktatóanyagban meghatározott alkalmazáskonfigurációk importálásához adja hozzá a következő kódot a app.py:
import identity.web
import requests
from flask import Flask, redirect, render_template, request, session, url_for
from flask_session import Session
import app_config
Ebben a kódrészletben importálja a , , , session
és : függvényeket és url_for
objektumokat a Flaskban a webes kérések és munkamenetek request
kezeléséhez. render_template
redirect
Importálja app_config
is az alkalmazást, amely tartalmazza az alkalmazás konfigurációs beállításait.
A Flask-webalkalmazás egy példányának létrehozása
A szükséges modulok importálása után inicializáljuk a webalkalmazást a következő konfigurációkkal app-config
: . A webalkalmazás egy példányának létrehozásához adja hozzá a következő kódrészletet a következőhöz app.py
:
app = Flask(__name__)
app.config.from_object(app_config)
assert app.config["REDIRECT_PATH"] != "/", "REDIRECT_PATH must not be /"
Session(app)
A fenti kódrészletben inicializál egy új Flask-alkalmazást, és betölti a konfigurációs beállításokat a következővel app.config.from_object(app_config)
: . A használatával from_object
az alkalmazás a megadotttól (app_config)
örökli a konfigurációkat.
Egy helyességi ellenőrzést is végrehajt, hogy az alkalmazás átirányítási útvonala ne legyen a gyökérútvonal ("/") értékre állítva. Session(app)
Inicializálja az alkalmazás munkamenet-felügyeletét, amely lehetővé teszi a munkamenetek kezelését és az olyan adatok tárolását, mint a felhasználói hitelesítési állapotok több kérelemben.
ProxyFix köztes szoftver konfigurálása helyi fejlesztéshez
Mivel a minta webalkalmazás helyi gazdagépen fut, a ProxyFix
köztes szoftverrel kijavítjuk a kérelem fejléceiben található URL-sémát és gazdagépadatokat. Adja hozzá a következő kódot a ProxyFix alkalmazásához app.py
:
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
Hitelesítési objektum inicializálása
Ezután inicializál egy hitelesítési objektumot az [identity.web.Auth](https://identity-library.readthedocs.io/en/latest/#identity.web.Auth)
osztály egy példányának létrehozásával. Az Auth objektum inicializálásakor a paramétereket session
authority
client_id
client_credential
is átadja a konstruktornak, az alábbiak szerint:
app.jinja_env.globals.update(Auth=identity.web.Auth) # Useful in template for B2C
auth = identity.web.Auth(
session=session,
authority=app.config["AUTHORITY"],
client_id=app.config["CLIENT_ID"],
client_credential=app.config["CLIENT_SECRET"],
)
Ebben a kódrészletben hozzáad egy új, elnevezett Auth
globális változót, app.jinja_env.globals.update(Auth=identity.web.Auth)
és hozzárendeli a következő értékhezidentity.web.Auth
: . Ez akadálymentessé teszi Auth
a Flask-alkalmazás által renderelt összes sablont.
Felhasználók bejelentkezése
Az alkalmazásban buildelt engedélyezési folyamat két lábból áll. Az első lépésben meghívja a függvényt a auth.log_in
felhasználók bejelentkezéséhez, az alábbi módon:
@app.route("/login")
def login():
return render_template("login.html", version=__version__, **auth.log_in(
scopes=app_config.SCOPE, # Have user consent to scopes during log-in
redirect_uri=url_for("auth_response", _external=True), # Optional. If present, this absolute URL must match your app's redirect_uri registered in Microsoft Entra admin center
prompt="select_account", # Optional.
))
Amikor egy felhasználó megnyitja az /login
alkalmazás URL-címét, a Flask meghívja a nézetfüggvényt, amely kezeli a sablon renderelésére irányuló kérést login.html
. Belül login()
meghívja a függvényt azoknak a auth.log_in
hatóköröknek a listájával, amelyekhez a felhasználónak hozzá kell adnia a bejelentkezési folyamat során. A paraméterekben meg kell adnia redirect_uri
azokat a paramétereket is, amelyeknek meg kell egyeznie az alkalmazás átirányítási URI-jával, azaz a Microsoft Azure felügyeleti központjával.
Opcionálisan olyan paramétereket is hozzáadhat, mint prompt
például a bejelentkezési kérés viselkedését szabályozó paraméterek, ha újrahitelesítést, felhasználói hozzájárulást vagy fiókválasztást kér az aktív munkameneteket használó fiókok között.
Az engedélyezési folyamat második szakaszában a hitelesítési választ úgy kezeli, hogy meghívja a függvényt a auth.complete_log_in
redirect_uri vezérlőn belül, ahogy az látható:
@app.route(app_config.REDIRECT_PATH)
def auth_response():
result = auth.complete_log_in(request.args)
if "error" in result:
return render_template("auth_error.html", result=result)
return redirect(url_for("index"))
A complete_log_in()
függvény lekérdezési paraméterekként a bejövő auth_response
szótárt veszi fel. Ha sikeres, a függvény átirányítja a felhasználót az "index" útvonalra a használatával redirect(url_for("index"))
. Ez azt jelenti, hogy a felhasználó sikeresen bejelentkezett az adataiba egy már érvényesített azonosító jogkivonatból származó jogcímeket tartalmazó szótárként.
Ha az eredmény a feltétel if "error" in result:
által meghatározott hibát tartalmaz, renderelje a sablont "auth_error.html"
a felhasználónak.
Felhasználók kijelentkeztetése
Ha ki szeretne jelentkezni felhasználókat a Flask-alkalmazásból, hívja meg a metódust az auth.log_out()
alábbiak szerint:
@app.route("/logout")
def logout():
return redirect(auth.log_out(url_for("index", _external=True)))
Amikor egy felhasználó az alkalmazás URL-útvonalára navigál /logout
, a Flask meghívja a kijelentkezés függvényt, amely kijelentkezteti őket az aktuális alkalmazásból. Megadhatja azt a lapot is, amelybe a felhasználókat a kijelentkezéskor át kell irányítani. A kódrészletben átirányítjuk a felhasználókat az alkalmazás kezdőlapjára a url_for("index", _external=True).
Belépési pont meghatározása a webalkalmazáshoz
A bejelentkezés és a kijelentkezési logika implementálása után adjon hozzá egy belépési pontot az alkalmazás kezdőlapjához a index()
következő függvény létrehozásával:
@app.route("/")
def index():
if not (app.config["CLIENT_ID"] and app.config["CLIENT_SECRET"]):
# This check is not strictly necessary.
# You can remove this check from your production code.
return render_template('config_error.html')
if not auth.get_user():
return redirect(url_for("login"))
return render_template('index.html', user=auth.get_user(), version=__version__)
A index()
függvény akkor lesz meghívva, amikor egy felhasználó az alkalmazás gyökér URL-címére ("/") navigál. Az alkalmazás kezdőlapjának megjelenítése előtt kezeli a konfigurációs ellenőrzéseket és ellenőrzi a felhasználói hitelesítést. Ellenőrzi, hogy hiányzik-e az ügyfélazonosító és az ügyfélkulcs a konfigurációban, és ha valamelyik vagy mindkét érték hiányzik, a Flask megjeleníti a sablont "config_error.html"
.
A függvény azt is ellenőrzi auth.get_user()
, hogy a felhasználó hitelesítése megtörtént-e. Ha a felhasználó nincs hitelesítve, átirányítja őket az "login"
útvonalra. Ha hitelesítve van, a Flask megjeleníti a "index.html" sablont, és átadja a felhasználói objektumot (amelyről auth.get_user()
lekérte) a rendereléshez.