Share via


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_forobjektumokat a Flaskban a webes kérések és munkamenetek requestkezeléséhez. render_templateredirect Importálja app_configis 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_objectaz 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 sessionauthorityclient_idclient_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 Autha 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 promptpé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.

Következő lépések