Condividi tramite


Esercitazione: Effettuare l'accesso degli utenti a un'app Web Python Flask utilizzando la piattaforma di identità Microsoft

Si applica a: Cerchio verde con un simbolo di spunta bianco che indica che il contenuto seguente si applica ai tenant della forza lavoro. I tenant della forza lavoro Cerchio verde con un simbolo di spunta bianco che indica che il contenuto seguente si applica ai tenant esterni. I tenant esterni (Altre informazioni)

Questa esercitazione illustra come proteggere un'app Web Python Flask.

In questa esercitazione, farai:

  • Creare un progetto Python Flask
  • Installare le dipendenze necessarie
  • Configurare l'app Web Flask per l'uso di Microsoft Identity Platform per l'autenticazione
  • Testare l'esperienza di accesso e disconnessione nella tua app web Flask

Prerequisiti

  • Inquilino della forza lavoro. È possibile usare la directory predefinita o configurare un nuovo tenant.
  • Registrare una nuova app nell'interfaccia di amministrazione di Microsoft Entra, configurata solo per gli account in questa directory organizzativa. Per altri dettagli, vedere Registrare un'applicazione . Registrare i valori seguenti dalla pagina Panoramica dell'applicazione per usarli in un secondo momento:
    • ID applicazione (cliente)
    • ID della directory (cliente)
  • Aggiungere un segreto del client alla registrazione dell'app. Non usare segreti client nelle app di produzione. Usare invece certificati o credenziali federate. Per altre informazioni, vedere Aggiungere credenziali all'applicazione.

Creare un progetto Flask

  1. Creare una cartella per ospitare l'applicazione Flask, ad esempio flask-web-app.

  2. Aprire una finestra della console e passare nella directory della tua cartella dell'app Web Flask usando il comando

    cd flask-web-app
    
  3. Configurare l'ambiente virtuale

    A seconda del sistema operativo, eseguire i comandi seguenti per configurare l'ambiente virtuale e attivarlo:

    Per il sistema operativo Windows:

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

    Per il sistema operativo macOS o Linux:

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

Installare le dipendenze delle app

Per installare le dipendenze dell'app, eseguire i comandi seguenti:

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"

La libreria di ms_identity_python installata automaticamente installa Microsoft Authentication Library (MSAL) per Python come dipendenza. MSAL Python è la libreria che consente di autenticare gli utenti e gestire i token di accesso.

Dopo aver installato le librerie necessarie, aggiornare il file dei requisiti eseguendo il comando seguente:

pip freeze > requirements.txt

Configurare l'applicazione per l'autenticazione

Le applicazioni Web che consentono l'accesso degli utenti tramite Microsoft Identity Platform vengono configurate tramite un file di configurazione, con estensione env. In Python Flask deve specificare i valori seguenti:

Variabile di ambiente Description
AUTHORITY URL dell'istanza cloud in cui è registrata l'applicazione. Formato: https://{Instance}/{TenantId}. Usare uno dei valori di istanza seguenti:
- https://login.microsoftonline.com/ (cloud pubblico di Azure)
- https://login.microsoftonline.us/ (Azure US Government)
- https://login.microsoftonline.de/ (Microsoft Entra Germania)
- https://login.partner.microsoftonline.cn/ (Microsoft Entra China, gestito da 21Vianet)
TENANT_ID Identificatore del tenant in cui è registrata l'app. È preferibile utilizzare l'ID tenant dalla registrazione dell'app, oppure usane uno tra i seguenti:
- organizations: consentire l'accesso agli utenti con qualsiasi account aziendale o scolastico
- common: accedere agli utenti con qualsiasi account aziendale o dell'istituto di istruzione o account personale Microsoft
- consumers: consente di accedere solo agli utenti con un account personale Microsoft
CLIENT_ID Identificatore dell'applicazione (client) ottenuta dalla registrazione dell'app.
CLIENT_SECRET Valore del segreto ottenuto dall'aggiunta di credenziali nell'interfaccia di amministrazione di Microsoft Entra.
REDIRECT_URI URI in cui Microsoft Identity Platform invia i token di sicurezza dopo l'autenticazione.

Aggiornare il file di configurazione

  1. Creare un file con estensione env nella cartella radice per archiviare in modo sicuro la configurazione dell'app. Il file .env deve contenere le variabili di ambiente seguenti:

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

    Sostituire i segnaposto con i valori seguenti:

    • Sostituire <Enter_your_client_id> con l'ID applicazione (client) dell'app Web client registrata.
    • Sostituire <Enter_tenant_id> con l'ID directory (tenant) in cui è stata registrata l'app Web.
    • Sostituire <Enter_your_client_secret> con il valore segreto client per l'app Web creata. In questa esercitazione vengono usati segreti a scopo dimostrativo. Nell'ambiente di produzione usare approcci più sicuri, ad esempio certificati o credenziali di identità federate.
    • Sostituire <Enter_redirect_uri> con l'URI di reindirizzamento registrato in precedenza. Questo tutorial imposta il percorso dell'URI di reindirizzamento su http://localhost:3000/getAToken.
  2. Creare un file app_config.py per leggere le variabili di ambiente e aggiungere altre configurazioni necessarie.

    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.
    

Configurare gli endpoint dell'app

In questa fase si creano gli endpoint dell'app Web e si aggiunge la logica di business all'applicazione.

  1. Creare un file denominato app.py nella cartella radice.

  2. Importare le dipendenze necessarie all'inizio del file app.py.

    import os
    import requests
    from flask import Flask, render_template
    from identity.flask import Auth
    import app_config
    
  3. Inizializzare l'app Flask e configurarla per usare il tipo di archiviazione sessione specificato nel file app_config.py.

    app = Flask(__name__)
    app.config.from_object(app_config)
    
  4. Inizializza il client dell'app. Un'app Web Flask è un client riservato. Il segreto del client viene passato perché i client riservati possono memorizzarlo in modo sicuro. In background, la libreria di identità chiama la classe ConfidentialClientApplication della libreria MSAL.

    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. Aggiungere gli endpoint necessari all'app Flask. L'app Web usa il flusso del codice di autorizzazione per effettuare l'accesso dell'utente. La libreria di supporto MSAL ms_identity_python aiuta nell'interazione con la libreria MSAL, rendendo così più facile l'aggiunta di funzionalità di accesso e disconnessione nella tua app. Si aggiunge una pagina di indice e la si protegge usando l'elemento Decorator login_required fornito dalla libreria di ms_identity_python. L'login_required decorator garantisce che solo gli utenti autenticati possano accedere alla pagina di indice.

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

    È garantito che l'utente sia presente perché questa vista è stata decorata con @login_required.

Creare i modelli di app

Creare una cartella denominata modelli nella cartella radice. Nella cartella templates creare un file denominato index.html. Questa è la home page dell'app. Aggiungere il codice seguente al file 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>

Eseguire e testare l'app Web di esempio

  1. Nel terminale eseguire il comando seguente:

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

    È possibile usare la porta preferita. Questa porta dovrebbe essere simile alla porta dell'URI di reindirizzamento registrato in precedenza.

  2. Aprire il browser, quindi passare a http://localhost:3000. Viene visualizzata una pagina di accesso.

  3. Accedere con l'account Microsoft seguendo questa procedura. È necessario specificare un indirizzo di posta elettronica e una password per l'accesso.

  4. Se sono presenti ambiti necessari per l'applicazione, viene visualizzata una schermata di consenso. L'applicazione richiede l'autorizzazione per mantenere l'accesso ai dati a cui hai consentito l'accesso e per effettuare l'accesso al tuo account. Selezionare Accetta. Questa schermata non viene visualizzata se non sono definiti ambiti.

Dopo l'accesso o l'iscrizione, si viene reindirizzati all'app Web. Viene visualizzata una pagina simile alla schermata seguente:

Screenshot dell'esempio di applicazione Web Flask dopo l'autenticazione riuscita.

Selezionare Logout per disconnettersi dall'app. Viene richiesto di selezionare un account da cui disconnettersi. Selezionare l'account usato per accedere.

Usare un dominio URL personalizzato (facoltativo)

Gli ambienti di lavoro non supportano i domini URL personalizzati.