Dela via


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. Workforce-hyresgäster grön cirkel med en vit bockmarkeringssymbol. externa hyresgäster (läs mer)

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

I den här handledningen ska du;

  • 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

  • Kontrollera att du har en appregistrering i din hyresgäst. Kontrollera att du har följande från din appregistreringsinformation:
    • ID:t program (klient) för klientwebbappen som du registrerade.
    • ID för Directory (klientorganisation) där du registrerade din webbapplikation.
    • Värdet på klient-hemlighet för webbappen som du skapade.

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

Lägg till dina konfigurationer

  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)

Personalklienter stöder inte anpassade URL-domäner.