教學課程:使用 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

設定應用程式以進行驗證

透過 Microsoft 身份平台登入使用者的網頁應用程式,會透過設定檔 .env 進行設定。 在 Python Flask 中,必須指定以下值:

環境變數 Description
AUTHORITY 應用程式註冊的雲端實例的網址。 格式:https://{Instance}/{TenantId}。 請使用以下其中一個實例值:
- https://login.microsoftonline.com/ (Azure 公有雲)
- https://login.microsoftonline.us/ (Azure 美國政府)
- https://login.microsoftonline.de/ (Microsoft Entra 德國)
- https://login.partner.microsoftonline.cn/ (Microsoft Entra China,由21Vianet營運)
TENANT_ID 應用程式註冊所在租戶的識別碼。 建議使用應用程式註冊時的租戶編號,或使用以下之一:
- organizations:在任何工作或學校帳號登入使用者
- common:使用任何工作、學校帳號或 Microsoft 個人帳號來登入使用者
- consumers:僅限使用 Microsoft 個人帳號的使用者登入
CLIENT_ID 應用程式(用戶端)識別碼,該識別碼來自應用程式註冊。
CLIENT_SECRET 從 Microsoft Entra 管理中心的新增憑證中取得的秘密值。
REDIRECT_URI URI 是 Microsoft 身份平台在驗證後傳送安全權杖的地方。

更新組態檔

  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 網域。