Udostępnij za pośrednictwem


Samouczek: dodawanie logowania do aplikacji internetowej platformy Python Flask

Ten samouczek jest trzecią częścią serii samouczków, która demonstruje tworzenie aplikacji internetowej platformy Python Flask od podstaw i integrowanie uwierzytelniania przy użyciu Platforma tożsamości Microsoft. W tym samouczku dodasz kod w celu uwierzytelnienia użytkowników w utworzonej aplikacji.

  • Importowanie wymaganych modułów i konfiguracji
  • Tworzenie wystąpienia aplikacji internetowej platformy Flask
  • Konfigurowanie oprogramowania pośredniczącego ProxyFix na potrzeby programowania lokalnego
  • Dodawanie kodu w celu zalogowania się i wylogowania użytkowników
  • Definiowanie punktu wejścia dla aplikacji internetowej

Importowanie wymaganych pakietów i konfiguracji

Tworzona aplikacja internetowa używa pakietu utworzonego identity.web na podstawie biblioteki MSAL Python do uwierzytelniania użytkowników w aplikacjach internetowych. Aby zaimportować pakiet, platformę identity.web Flask, moduły Platformy Flask, sesję platformy Flask i konfiguracje aplikacji zdefiniowane w poprzednim samouczku, dodaj następujący kod do 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

W tym fragmencie kodu importujesz redirectfunkcje , render_template, request, sessioni url_for: do obsługi żądań internetowych i sesji na platformie Flask. Importujesz również element app_config, który zawiera ustawienia konfiguracji aplikacji.

Tworzenie wystąpienia aplikacji internetowej platformy Flask

Po zaimportowaniu wymaganych modułów zainicjujemy aplikację internetową przy użyciu konfiguracji w programie app-config. Aby utworzyć wystąpienie aplikacji internetowej, dodaj następujący fragment kodu do app.py:

app = Flask(__name__)
app.config.from_object(app_config)
assert app.config["REDIRECT_PATH"] != "/", "REDIRECT_PATH must not be /"
Session(app)

W powyższym fragmencie kodu zainicjujesz nową aplikację platformy Flask i załadujesz ustawienia konfiguracji przy użyciu polecenia app.config.from_object(app_config). Za pomocą polecenia from_objectaplikacja dziedziczy konfiguracje z określonego w pliku (app_config).

Sprawdzasz również asercji, aby upewnić się, że ścieżka przekierowania aplikacji nie jest ustawiona na ścieżkę główną ("/"). Session(app) Inicjuje zarządzanie sesjami dla aplikacji, co umożliwia obsługę sesji i przechowywanie danych, takich jak stany uwierzytelniania użytkowników w wielu żądaniach.

Konfigurowanie oprogramowania pośredniczącego ProxyFix na potrzeby programowania lokalnego

Ponieważ przykładowa aplikacja internetowa działa na hoście lokalnym, używamy ProxyFix oprogramowania pośredniczącego, aby naprawić schemat adresów URL i informacje o hoście w nagłówkach żądań. Dodaj następujący kod, aby app.py zastosować poprawkę serwera proxy:

from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)

Inicjowanie obiektu uwierzytelniania

Następnie zainicjujesz obiekt uwierzytelniania, tworząc wystąpienie [identity.web.Auth](https://identity-library.readthedocs.io/en/latest/#identity.web.Auth) klasy. Parametry , , authorityclient_idi client_credential w konstruktorze są również przekazywane sessionpodczas inicjowania obiektu uwierzytelniania w następujący sposób:

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"],
)

W tym fragmencie app.jinja_env.globals.update(Auth=identity.web.Auth)kodu dodaje nową zmienną globalną o nazwie Auth i przypisuje jej wartość identity.web.Auth. AuthSpowoduje to udostępnienie wszystkich szablonów renderowanych przez aplikację platformy Flask.

Logowanie użytkowników

Przepływ autoryzacji, który tworzysz w tej aplikacji, składa się z dwóch nóg. W pierwszym etapie wywołujesz funkcję w celu zalogowania auth.log_in użytkowników, jak pokazano poniżej:

@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.
        ))

Gdy użytkownik przejdzie do /login adresu URL w aplikacji, platforma Flask wywołuje funkcję widoku, która obsługuje żądanie renderowania szablonu login.html . W login()programie wywołujesz auth.log_in funkcję z listą zakresów, na które użytkownik powinien wyrazić zgodę podczas procesu logowania. Parametry powinny być również redirect_uri zgodne z identyfikatorem URI przekierowania aplikacji i centrum administracyjnym platformy Microsoft Azure.

Opcjonalnie możesz dodać parametry, takie jak prompt, które sterują zachowaniem monitu logowania, żądając ponownego uwierzytelnienia, zgody użytkownika lub wyboru konta między kontami z aktywnymi sesjami.

W drugiej części przepływu autoryzacji obsługiwana jest odpowiedź uwierzytelniania przez wywołanie auth.complete_log_in funkcji wewnątrz kontrolera redirect_uri, jak pokazano poniżej:

@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"))

Funkcja complete_log_in() przyjmuje w słowniku przychodzącym auth_response jako parametry zapytania. W przypadku powodzenia funkcja przekierowuje użytkownika do trasy "index" przy użyciu polecenia redirect(url_for("index")). Oznacza to, że użytkownik pomyślnie zalogował się w swoich informacjach, jest dostępny jako słownik zawierający oświadczenia z już zweryfikowanego tokenu identyfikatora.

Jeśli wynik zawiera błąd określony przez warunek if "error" in result:, renderowanie "auth_error.html" szablonu użytkownikowi.

Wylogowywanie użytkowników

Aby wylogować użytkowników z aplikacji Platformy Flask, wywołaj metodę auth.log_out() w następujący sposób:

@app.route("/logout")
def logout():
    return redirect(auth.log_out(url_for("index", _external=True)))

Gdy użytkownik przejdzie do /logout trasy adresu URL w aplikacji, platforma Flask wywołuje funkcję wylogowywania, która wyloguje je z bieżącej aplikacji. Należy również określić stronę, do której użytkownicy powinni zostać przekierowani po wylogowaniu. We fragmencie kodu przekierowujemy użytkowników do strony głównej aplikacji przy użyciu polecenia url_for("index", _external=True).

Definiowanie punktu wejścia dla aplikacji internetowej

Po zaimplementowaniu logiki logowania i wylogowania dodaj punkt wejścia do strony głównej aplikacji, tworząc index() funkcję w następujący sposób:

@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__)

Funkcja index() jest wywoływana, gdy użytkownik przechodzi do głównego adresu URL("/"). Obsługuje kontrole konfiguracji i weryfikuje uwierzytelnianie użytkownika przed renderowaniem strony głównej aplikacji. Sprawdza, czy w konfiguracji brakuje identyfikatora klienta i klucza tajnego klienta, a jeśli brakuje wartości lub obu tych wartości, platforma Flask renderuje "config_error.html" szablon.

Funkcja wywołuje auth.get_user() również polecenie w celu sprawdzenia, czy użytkownik jest uwierzytelniony, czy nie. Jeśli użytkownik nie jest uwierzytelniony, przekierowuje je do "login" trasy. W przypadku uwierzytelnienia platforma Flask renderuje szablon "index.html" i przekazuje obiekt użytkownika (pobrany z auth.get_user()programu ) do renderowania.

Następne kroki