Självstudie: Lägga till inloggning i en Python Flask-webbapp
Den här självstudien är den tredje delen i en självstudieserie som visar hur du skapar en Python Flask-webbapp från grunden och integrerar autentisering med hjälp av Microsofts identitetsplattform. I den här självstudien lägger du till kod för att autentisera användare i den app som du skapade.
- Importera nödvändiga moduler och konfigurationer
- Skapa en instans av en Flask-webbapp
- Konfigurera ProxyFix-mellanprogram för lokal utveckling
- Lägga till kod för att logga in och logga ut användare
- Definiera en startpunkt för webbappen
Importera nödvändiga paket och konfigurationer
Webbappen som du skapar använder paketet som bygger på MSAL Python för att autentisera identity.web
användare i webbappar. Om du vill importera identity.web
paketet, Flask Framework, Flask-moduler, Flask-sessionen och appkonfigurationerna som definierades i föregående självstudie lägger du till följande kod i 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
I det här kodfragmentet importerar redirect
du funktionerna , render_template
, request
, session
och url_for
: och : för hantering av webbbegäranden och sessioner i Flask. Du importerar app_config
också , som innehåller konfigurationsinställningarna för din app.
Skapa en instans av Flask-webbappen
När du har importerat de moduler som krävs initierar vi webbappen med hjälp av konfigurationerna i app-config
. Om du vill skapa en instans av webbappen lägger du till följande kodfragment i app.py
:
app = Flask(__name__)
app.config.from_object(app_config)
assert app.config["REDIRECT_PATH"] != "/", "REDIRECT_PATH must not be /"
Session(app)
I kodfragmentet ovan initierar du ett nytt Flask-program och läser in konfigurationsinställningarna med hjälp av app.config.from_object(app_config)
. Med hjälp from_object
av ärver appen konfigurationerna från angiven i (app_config)
.
Du utför också en kontroll för att säkerställa att omdirigeringssökvägen för din app inte är inställd på rotsökvägen ("/"). Session(app)
initierar sessionshantering för din app, vilket gör att du kan hantera sessioner och lagra data, till exempel användarautentiseringstillstånd för flera begäranden.
Konfigurera ProxyFix-mellanprogram för lokal utveckling
Eftersom exempelwebbappen körs på den ProxyFix
lokala värden använder vi mellanprogrammet för att åtgärda URL-schemat och värdinformationen i begäranderubrikerna. Lägg till följande kod för att app.py
tillämpa ProxyFix:
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
Initiera ett autentiseringsobjekt
Sedan initierar du ett autentiseringsobjekt genom att skapa en instans av [identity.web.Auth](https://identity-library.readthedocs.io/en/latest/#identity.web.Auth)
klassen. Du skickar även parametrarna session
, authority
, client_id
och client_credential
i konstruktorn när du initierar Auth-objektet enligt följande:
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"],
)
I det här kodfragmentet app.jinja_env.globals.update(Auth=identity.web.Auth)
lägger du till en ny global variabel med namnet Auth
och tilldelar den värdet identity.web.Auth
. Detta gör Auth
det tillgängligt i alla mallar som återges av Flask-programmet.
Logga in användare
Auktoriseringsflödet som du skapar i den här appen består av två ben. I den första delen anropar auth.log_in
du funktionen för att logga in användare, enligt följande:
@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.
))
När en användare navigerar till /login
URL:en i din app anropar Flask den vyfunktion som hanterar begäran om att återge mallen login.html
. I login()
anropar auth.log_in
du funktionen med en lista över omfång som användaren bör godkänna under inloggningsprocessen. Du anger redirect_uri
även i parametrarna, som ska matcha appens omdirigerings-URI i administrationscentret för Microsoft Azure.
Du kan också lägga till parametrar som prompt
, som styr beteendet för loggen i prompten genom att begära omautentisering, användarmedgivande eller val av konto bland konton med aktiva sessioner.
I den andra delen av auktoriseringsflödet hanterar du autentiseringssvaret genom att anropa auth.complete_log_in
funktionen i den redirect_uri kontrollanten, enligt följande:
@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"))
Funktionen complete_log_in()
använder den inkommande auth_response
ordlistan som frågeparametrar. Om det lyckas omdirigerar funktionen användaren till "index"-vägen med hjälp av redirect(url_for("index"))
. Det innebär att användaren har loggat in sin information är tillgänglig som en ordlista som innehåller anspråk från en redan verifierad ID-token.
Om resultatet innehåller ett fel som bestäms av villkoret if "error" in result:
återger du mallen "auth_error.html"
till användaren.
Logga ut användare
Om du vill logga ut användare från flaskprogrammet anropar du metoden på auth.log_out()
följande sätt:
@app.route("/logout")
def logout():
return redirect(auth.log_out(url_for("index", _external=True)))
När en användare navigerar till /logout
URL-vägen i appen anropar Flask utloggningsfunktionen som loggar ut dem från den aktuella appen. Du anger också den sida som användarna ska omdirigeras till när de loggar ut. I kodfragmentet omdirigerar vi användare till appens startsida med hjälp av url_for("index", _external=True).
Definiera en startpunkt för webbappen
När du har implementerat inloggnings- och utloggningslogik lägger du till en startpunkt på appens startsida genom att skapa funktionen på index()
följande sätt:
@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__)
Funktionen index()
anropas när en användare navigerar till appens rot-URL("/"). Den hanterar konfigurationskontroller och validerar användarautentisering innan appens startsida återges. Den kontrollerar om klient-ID och klienthemlighet saknas i konfigurationen, och om något av eller båda värdena saknas renderar Flask mallen "config_error.html"
.
Funktionen anropar auth.get_user()
också för att kontrollera om användaren är autentiserad eller inte. Om användaren inte autentiseras omdirigeras de till "login"
vägen. Om den autentiseras renderar Flask mallen "index.html" och skickar användarobjektet (hämtat från auth.get_user()
) för återgivning.
Nästa steg
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för