Självstudie: Logga in användare till en Python Flask-webbapp med hjälp av Microsofts identitetsplattform

Gäller för: Grön cirkel med en vit bockmarkeringssymbol som anger att följande innehåll gäller för personalklienter.Personalklienter Grön cirkel med en vit bockmarkeringssymbol som anger att följande innehåll gäller för externa klienter. Externa klienter (läs mer)

Den här handledningen beskriver hur du skyddar en Python Flask-webbapplikation.

I den här handledningen kommer du att:

  • Skapa ett Python Flask-projekt
  • Installera nödvändiga beroenden
  • Konfigurera flaskwebbappen så att den använder Microsofts identitetsplattform för autentisering
  • Testa inloggnings- och utloggningsupplevelsen i Flask-webbappen

Förutsättningar

  • En hyresgäst för arbetskraft. Du kan använda din standardkatalog eller konfigurera en ny klient.
  • Registrera en ny app i administrationscentret för Microsoft Entra, som endast konfigurerats för konton i den här organisationskatalogen. Mer information finns i Registrera ett program . Registrera följande värden från programöversiktssidan för senare användning:
    • App-ID (klient-ID)
    • Katalog-ID (hyresgäst)
  • Lägg till en klienthemlighet i din appregistrering. Använd inte klienthemligheter i produktionsappar. Använd certifikat eller federerade autentiseringsuppgifter i stället. Mer information finns i lägga till autentiseringsuppgifter i ditt program.

Skapa ett Flask-projekt

  1. Skapa en mapp som värd för Flask-programmet, till exempel flask-web-app.

  2. Öppna ett konsolfönster och byt katalog till din Flask-webbappmapp med kommandot.

    cd flask-web-app
    
  3. Skapa virtuell miljö

    Beroende på operativsystemet kör du följande kommandon för att konfigurera din virtuella miljö och aktivera den:

    För Windows-operativsystemet:

    py -m venv .venv
    .venv\scripts\activate
    

    För macOS- eller Linux-operativsystem:

    python3 -m venv .venv
    source .venv/bin/activate
    

Installera appens beroenden

Installera appberoenden genom att köra följande kommandon:

pip install flask
pip install python-dotenv
pip install requests
pip install "ms_identity_python[flask] @ git+https://github.com/azure-samples/ms-identity-python@0.9"

Det bibliotek som du installerar, ms_identity_python, installerar automatiskt Microsoft Authentication Library (MSAL) för Python som ett beroende. MSAL Python är det bibliotek där du kan autentisera användare och hantera deras åtkomsttoken.

När du har installerat de bibliotek som krävs uppdaterar du kravfilen genom att köra följande kommando:

pip freeze > requirements.txt

Konfigurera programmet för autentisering

Webbprogram som loggar in användare med hjälp av Microsofts identitetsplattform konfigureras via en konfigurationsfil, .env. I Python Flask måste den ange följande värden:

Miljövariabel Description
AUTHORITY URL:en för molninstansen där programmet är registrerat. Format: https://{Instance}/{TenantId}. Använd något av följande instansvärden:
- https://login.microsoftonline.com/ (Offentligt Azure-moln)
- https://login.microsoftonline.us/ (Azure US Government)
- https://login.microsoftonline.de/ (Microsoft Entra Tyskland)
- https://login.partner.microsoftonline.cn/ (Microsoft Entra China, som drivs av 21Vianet)
TENANT_ID Identifieraren för klientorganisationen där appen är registrerad. Föredra hyrorganisations-ID:t från appregistreringen eller använd något av:
- organizations: logga in användare på ett arbets- eller skolkonto
- common: logga in användare med ett arbets- eller skolkonto eller ett personligt Microsoft-konto
- consumers: logga endast in användare med ett personligt Microsoft-konto
CLIENT_ID Identifierare för programmet (klienten) som hämtats från appregistreringen.
CLIENT_SECRET Det hemliga värdet som hämtas från lägg till autentiseringsuppgifter i administrationscentret för Microsoft Entra.
REDIRECT_URI URI:n där Microsofts identitetsplattform skickar säkerhetstoken efter autentisering.

Uppdatera konfigurationsfilen

  1. Skapa en .env-fil i rotmappen för att lagra appens konfiguration på ett säkert sätt. Filen .env ska innehålla följande miljövariabler:

    CLIENT_ID="<Enter_your_client_id>"
    CLIENT_SECRET="<Enter_your_client_secret>"
    AUTHORITY="https://login.microsoftonline.com/<Enter_tenant_id>"
    REDIRECT_URI="<Enter_redirect_uri>"
    

    Ersätt platshållarna med följande värden:

    • Ersätt <Enter_your_client_id> med program-ID (klient)-ID:t för klientwebbappen som du registrerade.
    • Ersätt <Enter_tenant_id> med -katalog-ID (hyresgäst) som du registrerade din webbapp i.
    • Ersätt <Enter_your_client_secret> med värdet Klienthemlighet för webbappen som du skapade. I den här handledningen använder vi hemligheter i demonstrationssyfte. I produktion använder du säkrare metoder som certifikat eller federerade identitetsautentiseringsuppgifter.
    • Ersätt <Enter_redirect_uri> med den omdirigerings-URI som du registrerade tidigare. I den här självstudien ställs omdirigerings-URI-sökvägen in till http://localhost:3000/getAToken.
  2. Skapa en app_config.py fil för att läsa miljövariablerna och lägga till andra konfigurationer som du behöver.

    import os
    
    AUTHORITY = os.getenv("AUTHORITY")
    CLIENT_ID = os.getenv("CLIENT_ID")
    CLIENT_SECRET = os.getenv("CLIENT_SECRET")
    REDIRECT_URI = os.getenv("REDIRECT_URI")
    SESSION_TYPE = "filesystem" # Tells the Flask-session extension to store sessions in the filesystem. Don't use in production apps.
    

Konfigurera appslutpunkter

I det här skedet skapar du dina webbappslutpunkter och lägger till affärslogik i ditt program.

  1. Skapa en fil med namnet app.py i rotmappen.

  2. Importera nödvändiga beroenden överst i filen app.py.

    import os
    import requests
    from flask import Flask, render_template
    from identity.flask import Auth
    import app_config
    
  3. Initiera Flask-appen och konfigurera den så att den använder den sessionslagringstyp som du angav i din app_config.py-fil.

    app = Flask(__name__)
    app.config.from_object(app_config)
    
  4. Initiera klienten för appklienten. En Flask-webbapp är en konfidentiell klient. Vi skickar klienthemligheten eftersom konfidentiella klienter kan lagra den på ett säkert sätt. Under huven använder Identitetsbiblioteket MSAL-bibliotekets ConfidentialClientApplication-klass.

    auth = Auth(
        app,
        authority=app.config["AUTHORITY"],
        client_id=app.config["CLIENT_ID"],
        client_credential=app.config["CLIENT_SECRET"],
        redirect_uri=app.config["REDIRECT_URI"]
    )
    
  5. Lägg till de slutpunkter som krävs i Flask-appen. Webbappen använder auktoriseringskodflödet för att logga in användaren. Det ms_identity_python MSAL-omslutningsbiblioteket hjälper dig att interagera med MSAL-biblioteket, vilket gör det enklare att lägga till inloggning och logga ut till din app. Vi lägger till en indexsida och skyddar den med hjälp av login_required dekoratör som tillhandahålls av ms_identity_python-biblioteket. Den login_required-dekoratören säkerställer att endast auktoriserade användare kan komma åt indexsidan.

    @app.route("/")
    @auth.login_required
    def index(*, context):
        return render_template(
            'index.html',
            user=context['user'],
            title="Flask Web App Sample",
        )
    

    Användaren är garanterad att vara närvarande eftersom vi har dekorerat den här vyn med @login_required.

Skapa appmallarna

Skapa en mapp med namnet mallar i rotmappen. I mappen mallar skapar du en fil med namnet index.html. Det här är appens startsida. Lägg till följande kod i filen index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <h2>Welcome {{ user.get("name") }}!</h2>

    <img src="https://github.com/Azure-Samples/ms-identity-python-webapp-django/raw/main/static/topology.png" alt="Topology">

    <ul>
    {% if api_endpoint %}
        <!-- If an API endpoint is declared and scopes defined, this link will show. We set this in the call an API tutorial. For this tutorial, we do not define this endpoint. -->
        <li><a href='/call_api'>Call an API</a></li>
    {% endif %}

    <li><a href="{{ url_for('identity.logout') }}">Logout</a></li>
    </ul>

    <hr>
    <footer style="text-align: right">{{ title }}</footer>
</body>
</html>

Köra och testa exempelwebbappen

  1. Kör följande kommando i terminalen:

    python3 -m flask run --debug --host=localhost --port=3000
    

    Du kan använda valfri port. Den här porten bör likna porten för den omdirigerings-URI som du registrerade tidigare.

  2. Öppna webbläsaren och gå sedan till http://localhost:3000. Du ser en inloggningssida.

  3. Logga in med ditt Microsoft-konto genom att följa stegen. Du uppmanas att ange en e-postadress och ett lösenord för att logga in.

  4. Om det finns några omfång som krävs av programmet visas en samtyckesskärm. Programmet begär behörighet att behålla åtkomsten till data som du tillåter åtkomst till och för att logga in dig. Välj Acceptera. Den här skärmen visas inte om inga omfång har definierats.

När du har loggat in eller registrerat dig omdirigeras du tillbaka till webbappen. Du ser en sida som liknar följande skärmbild:

Skärmbild av flask-webbappsexempel efter lyckad autentisering.

Välj Utloggning för att logga ut från appen. Du uppmanas att välja ett konto att logga ut från. Välj det konto som du använde för att logga in.

Använda anpassad URL-domän (valfritt)

Arbetskraftshyresgäster stöder inte anpassade URL-domäner.