分享方式:


快速入門:從 Python 精靈應用程式取得權杖並呼叫 Microsoft Graph

在本快速入門中,您會下載並執行程式碼範例,該範例會示範 Python 應用程式如何使用應用程式的身分識別來取得存取權杖,以呼叫 Microsoft Graph API 及顯示目錄中的使用者清單。 此程式碼範例會示範自動作業或 Windows 服務如何使用應用程式識別來執行,而不是以使用者的身分識別執行。

此圖表顯示此快速入門所產生的範例應用程式的運作方式。

必要條件

若要執行此範例,您需要:

註冊並下載快速入門應用程式

步驟 1:註冊您的應用程式

提示

根據您開始使用的入口網站,本文中的步驟可能略有不同。

若要手動註冊您的應用程式,並將應用程式註冊資訊新增到您的解決方案,請執行下列步驟:

  1. 登入 Microsoft Entra 系統管理中心。
  2. 如果您有多個租用戶的存取權,請使用頂端功能表中的 [設定] 圖示 ,從 [目錄 + 訂用帳戶] 功能表來切換至您要在其中註冊應用程式的租用戶。
  3. 瀏覽至 [身分識別]>[應用程式]>[應用程式註冊],選取 [新增註冊]
  4. 輸入應用程式的名稱,例如 Daemon-console。 您的應用程式使用者可能會看到此名稱,而且您稍後可以加以變更。
  5. 選取註冊
  6. 在 [管理] 下,選取 [憑證和密碼]
  7. 在 [用戶端密碼] 底下,選取 [新增用戶端密碼] 並輸入名稱,然後選取 [新增]。 將祕密值記錄在安全的位置,以便在稍後的步驟中使用。
  8. 在 [管理] 底下,選取 [API 權限]>[新增權限]。 選取 [Microsoft Graph]
  9. 選取應用程式權限
  10. 在 [使用者] 節點底下,選取 [User.Read.All],然後選取 [新增權限]

步驟 2:下載 Python 專案

下載 Python 精靈專案

步驟 3:設定 Python 專案

  1. 將 Zip 檔案解壓縮至磁碟根目錄附近的本機資料夾,例如 C:\Azure-Samples

  2. 瀏覽至子資料夾 1-Call-MsGraph-WithSecret

  3. 編輯 parameters.json,並將欄位 authorityclient_idsecret 的值取代為下列程式碼片段:

    "authority": "https://login.microsoftonline.com/Enter_the_Tenant_Id_Here",
    "client_id": "Enter_the_Application_Id_Here",
    "secret": "Enter_the_Client_Secret_Here"
    

    其中:

    • Enter_the_Application_Id_Here - 是您註冊的應用程式所具備的應用程式 (用戶端) 識別碼
    • Enter_the_Tenant_Id_Here - 請將此值取代為 [租用戶識別碼] 或 [租用戶名稱] (例如 contoso.microsoft.com)
    • Enter_the_Client_Secret_Here - 請將此值取代為步驟 1 所建立的用戶端密碼。

提示

若要尋找 [應用程式 (用戶端) 識別碼]、[目錄 (租用戶) 識別碼] 的值,請在 Microsoft Entra 系統管理中心中移至應用程式的 [概觀] 頁面。 若要產生新的金鑰,請移至 [憑證和祕密] 頁面。

如果您嘗試在此時執行應用程式,您將會收到「HTTP 403 - 禁止」錯誤:Insufficient privileges to complete the operation。 之所以發生此錯誤,是因為任何「僅限應用程式權限」都需要管理員同意:目錄的全域管理員必須對應用程式表示同意。 請根據您的角色選取下列其中一個選項:

全域租用戶管理員

如果您是全域租用戶管理員,請移至 Microsoft Entra 系統管理中心 [應用程式註冊] 中的 [API 權限] 頁面,然後選取 [代表 {租用戶名稱} 授與管理員同意] (其中,{租用戶名稱} 是您的目錄名稱)。

標準使用者

如果您是租用戶的標準使用者,請全域管理員針對應用程式授與管理員同意。 若要這樣做,請提供下列 URL 給管理員:

https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

其中:

  • Enter_the_Tenant_Id_Here - 請將此值取代為 [租用戶識別碼] 或 [租用戶名稱] (例如 contoso.microsoft.com)
  • Enter_the_Application_Id_Here - 是您先前註冊之應用程式的應用程式 (用戶端) 識別碼

步驟 5:執行應用程式

您必須安裝此範例的相依性一次。

pip install -r requirements.txt

然後,透過命令提示字元或主控台執行應用程式:

python confidential_client_secret_sample.py parameters.json

您應該會在主控台輸出中看到一些 JSON 片段,代表您 Microsoft Entra 目錄中的使用者清單。

重要

此快速入門應用程式會使用用戶端密碼,將自己識別為機密用戶端。 由於用戶端密碼會以純文字形式新增至您的專案檔,因此,基於安全考量,在考慮將應用程式當作生產應用程式之前,建議您使用憑證,而非用戶端密碼。 如需關於如何使用憑證的詳細資訊,請在相同的 GitHub 存放庫 (但位於第二個資料夾 2-Call-MsGraph-WithCertificate) 中參閱此範例的這些指示

其他相關資訊

MSAL Python

MSAL Python 是一個程式庫,用來登入使用者,以及要求所需權杖用以存取受 Microsoft 身分識別平台保護的 API。 如前所述,本快速入門會使用應用程式本身的身分識別 (而非委派的權限) 來要求權杖。 此案例所使用的驗證流程稱為用戶端認證 OAuth 流程。 如需如何搭配使用 MSAL Python 與精靈應用程式的詳細資訊,請參閱這篇文章

您可以藉由執行下列 pip 命令來安裝 MSAL Python。

pip install msal

MSAL 初始化

您可以透過加入下列程式碼來新增 MSAL 的參考:

import msal

接著,使用下列程式碼將 MSAL 初始化:

app = msal.ConfidentialClientApplication(
    config["client_id"], authority=config["authority"],
    client_credential=config["secret"])
其中: 描述
config["secret"] 這是在 Microsoft Entra 系統管理中心為應用程式建立的客戶端密碼。
config["client_id"] 這是在 Microsoft Entra 系統管理中心註冊之應用程式的應用程式 (用戶端) 識別碼。 您可以在 Microsoft Entra 系統管理中心的應用程式 [概觀] 頁面中找到這個值。
config["authority"] 供使用者用於驗證的 STS 端點。 若為公用雲端,通常是 https://login.microsoftonline.com/{tenant},其中 {tenant} 是租用戶的名稱或租用戶識別碼。

如需詳細資訊,請參閱下列項目的參考文件:ConfidentialClientApplication

要求權杖

若要使用應用程式的身分識別來要求權杖,請使用 AcquireTokenForClient 方法:

result = None
result = app.acquire_token_silent(config["scope"], account=None)

if not result:
    logging.info("No suitable token exists in cache. Let's get a new one from AAD.")
    result = app.acquire_token_for_client(scopes=config["scope"])
其中: 描述
config["scope"] 包含所要求的範圍。 針對機密用戶端,這應該使用類似 {Application ID URI}/.default 的格式,以指出所要求的範圍是 Microsoft Entra 系統管理中心中所設定應用程式物件中以靜態方式定義的範圍 (若為 Microsoft Graph,{Application ID URI} 會指向 https://graph.microsoft.com)。 針對自定義 Web API,{Application ID URI} 定義於 Microsoft Entra 系統管理中心 [應用程式註冊] 的 [公開 API] 區段底下。

如需詳細資訊,請參閱下列項目的參考文件:AcquireTokenForClient

說明與支援 

如果您需要協助、想要回報問題,或想要深入了解您的支援選項,請參閱 開發人員的協助與支援

下一步

若要深入了解精靈應用程式,請參閱案例登陸頁面。