共用方式為


教學課程:使用 Microsoft 身分識別平臺登入 Python Flask Web 應用程式

適用於:白色勾號標記的綠色圓圈 。 員工租戶 白色勾號標記的綠色圓圈。 外部租戶(深入瞭解

本教學課程會引導您保護 Python Flask Web 應用程式。

在本教學課程中,您會:

  • 建立 Python Flask 專案
  • 安裝所需的依賴項
  • 設定 Flask Web 應用程式以使用Microsoft身分識別平台進行驗證
  • 在 Flask Web 應用程式中測試登入和註銷體驗

先決條件

  • 員工租戶。 您可以使用 預設目錄 或設定新的租戶。
  • Microsoft Entra 系統管理中心註冊新的應用程式, 僅針對此組織目錄中的帳戶進行設定。 如需詳細資訊 ,請參閱註冊應用程式 。 從應用程式 [概 ] 頁面記錄下列值,以供稍後使用:
    • 應用程式 (用戶端) 識別碼
    • 目錄(租戶)識別碼
  • 將客戶端密碼新增至您的應用程式註冊。 請勿 在生產應用程式中使用客戶端密碼。 請改用憑證或同盟認證。 如需詳細資訊,請參閱 將認證新增至您的應用程式

建立 Flask 專案

  1. 建立資料夾來載入 Flask 應用程式,例如 flask-web-app

  2. 開啟主控台視窗,並使用 命令將 目錄變更為 Flask Web 應用程式資料夾

    cd flask-web-app
    
  3. 設定虛擬環境

    根據您的作系統,執行下列命令來設定虛擬環境並加以啟用:

    針對 WINDOWS 作業系統:

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

    針對 macOS 或 Linux 作業系統:

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

安裝應用程式依賴項

若要安裝應用程式相依性,請執行下列命令:

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"

您安裝的 ms_identity_python 程式庫會自動安裝 Microsoft 驗證程式庫(MSAL),作為它的相依性。 MSAL Python 是可讓您驗證使用者及管理其存取令牌的連結庫。

安裝必要的連結庫之後,請執行下列命令來更新您的需求檔案:

pip freeze > requirements.txt

新增您的設定

  1. 在根資料夾中建立 .env* 檔案,以安全地儲存應用程式的組態。 您的 .env 檔案應包含下列環境變數:

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

    用以下值取代占位符:

    • <Enter_your_client_id> 替換為您註冊的用戶端 Web 應用程式的 應用程式(client)識別碼
    • <Enter_tenant_id> 替換為您註冊 Web 應用程式時使用的 目錄(租戶)ID
    • <Enter_your_client_secret> 取代為您建立之 Web 應用程式的 客戶端密碼 值。 在本教學課程中,我們會使用秘密進行示範。 在生產環境中,請使用更安全的方法,例如 憑證或同盟身分識別認證
    • <Enter_redirect_uri> 替換為您稍早註冊的重定向 URI。 本教學課程會將重新導向 URI 路徑設定為 http://localhost:3000/getAToken
  2. 建立 app_config.py 檔案來讀取環境變數,並新增您需要的其他組態。

    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.
    

設定應用程式端點

在這個階段,您會建立 Web 應用程式端點,並將商業規則新增至您的應用程式。

  1. 在根資料夾中建立名為 app.py 的檔案。

  2. app.py 檔案頂端匯入必要的相依性。

    import os
    import requests
    from flask import Flask, render_template
    from identity.flask import Auth
    import app_config
    
  3. 初始化 Flask 應用程式,並將其設定為使用您在 app_config.py 檔案中指定的工作階段記憶體類型。

    app = Flask(__name__)
    app.config.from_object(app_config)
    
  4. 初始化用戶端應用程式。 Flask Web 應用程式是機密用戶端。 我們會傳遞客戶端密碼,因為機密用戶端可以安全地儲存它。 身分識別程式庫會呼叫 MSAL 程式庫的 ConfidentialClientApplication 類別。

    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. 將必要的端點新增至 Flask 應用程式。 Web 應用程式會使用授權碼流程來登入使用者。 ms_identity_python MSAL 包裝函式庫有助於與 MSAL 函式庫互動,以便更方便地在您的應用程式中添加登入和登出功能。 我們會新增索引頁面,並使用 login_required 函式庫所提供的 裝飾器來保護它。 login_required 裝飾器可確保只有已驗證的使用者才能存取首頁。

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

    因為我們用@login_required來裝飾此視圖,因此可以確保使用者會出現。

建立應用程式範本

在根資料夾中建立一個叫 樣本 的資料夾。 在 templates 資料夾中,建立名為 index.html的檔案。 這是應用程式的首頁。 將下列程式代碼新增至 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>

執行及測試範例 Web 應用程式

  1. 在您的終端機中,執行下列命令:

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

    您可以使用您選擇的連接埠。 此埠應該類似於您稍早註冊的重新導向 URI 埠。

  2. 開啟瀏覽器,然後移至 http://localhost:3000。 您會看到登入頁面。

  3. 請遵循下列步驟,使用您的Microsoft帳戶登入。 系統會要求您提供登入的電子郵件地址和密碼。

  4. 如果應用程式需要任何權限,則會顯示同意畫面。 應用程式會請求許可,以維持對您允許的資料的存取權,並讓您登入。 選擇 接受。 如果未定義任何範圍,就不會顯示此畫面。

登入或註冊之後,系統會將您重新導向回 Web 應用程式。 您會看到類似下列螢幕快照的頁面:

成功驗證后 Flask Web 應用程式範例的螢幕快照。

選取 [登出] 以登出應用程式。 系統會提示您挑選要註銷的帳戶。 選取您用來登入的帳戶。

使用自訂網址 (選擇性)

工作團隊租戶不支援客製化 URL 網域。