快速入門:取得令牌,並從 Java 精靈應用程式呼叫 Microsoft Graph

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

Diagram showing how the sample app generated by this quickstart works.

必要條件

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

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

提示

本文中的步驟可能會根據您從開始的入口網站稍有不同。

步驟 1:註冊應用程式

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

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

步驟 2:下載 Java 專案

下載 Java 精靈專案

步驟 3:設定 Java 專案

  1. 將 zip 檔案解壓縮到靠近磁碟根目錄的本機資料夾, 例如 C:\Azure-Samples
  2. 流覽至 msal-client-credential-secret 子資料夾。
  3. 編輯 src\main\resources\application.properties 與取代欄位 AUTHORITYCLIENT_ID與值,並 SECRET 取代為下列代碼段:
  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 上建立的客戶端密碼。

提示

若要尋找應用程式 (用戶端) 識別碼目錄 (租使用者) 識別碼的值,請移至應用程式的 [概觀] 頁面。 若要產生新的金鑰,請移至 [ 憑證與秘密] 頁面。

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

全域租使用者管理員

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

標準使用者

如果您是租用戶的標準使用者,則必須要求 Global 管理員 istrator 授與應用程式的系統管理員同意。 若要這樣做,請為您的系統管理員提供下列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:執行應用程式

您可以直接從 IDE 執行 ClientCredentialGrant.java 的主要方法來測試範例。

從殼層或命令列:

$ mvn clean compile assembly:single

這會在您的目錄中產生 msal-client-credential-secret-1.0.0.jar 檔案 /targets 。 使用 Java 可執行檔來執行此作業,如下所示:

$ java -jar msal-client-credential-secret-1.0.0.jar

執行之後,應用程式應該會顯示已設定租使用者中的使用者清單。

重要

本快速入門應用程式會使用客戶端密碼,將自己識別為機密用戶端。 由於客戶端密碼會新增為項目檔的純文本,基於安全性考慮,建議您先使用憑證,而不是客戶端密碼,再將應用程式視為生產應用程式。 如需如何使用憑證的詳細資訊,請參閱 此範例的相同 GitHub 存放庫中的這些指示 ,但在第二個資料夾 MSAL-client-credential-certificate 中。

其他相關資訊

MSAL Java

MSAL Java 是用來登入使用者和要求令牌的連結庫,用來存取受 Microsoft 身分識別平台 保護的 API。 如所述,本快速入門會使用應用程式擁有的身分識別來要求令牌,而不是委派的許可權。 在此案例中使用的驗證流程稱為客戶端認證 oauth 流程 如需如何搭配精靈應用程式使用 MSAL Java 的詳細資訊,請參閱 這篇文章

使用 Maven 或 Gradle 將 MSAL4J 新增至您的應用程式,藉由對應用程式的 pom.xml (Maven) 或 build.gradle 檔案進行下列變更來管理相依性。

pom.xml

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>msal4j</artifactId>
    <version>1.0.0</version>
</dependency>

在 build.gradle 中:

compile group: 'com.microsoft.azure', name: 'msal4j', version: '1.0.0'

MSAL 初始化

將下列程式代碼新增至您將使用 MSAL4J 的檔案頂端,以新增適用於 Java 的 MSAL 參考:

import com.microsoft.aad.msal4j.*;

然後,使用下列程式代碼初始化 MSAL:

IClientCredential credential = ClientCredentialFactory.createFromSecret(CLIENT_SECRET);

ConfidentialClientApplication cca =
        ConfidentialClientApplication
                .builder(CLIENT_ID, credential)
                .authority(AUTHORITY)
                .build();
其中: 描述
CLIENT_SECRET 這是為應用程式建立的客戶端密碼。
CLIENT_ID 這是已註冊應用程式的應用程式 (用戶端) 識別碼。 您可以在應用程式的 [概觀 ] 頁面中找到此值。
AUTHORITY 用戶要驗證的 STS 端點。 通常 https://login.microsoftonline.com/{tenant} 適用於公用雲端,其中 {tenant} 是您租用戶的名稱或租用戶標識符。

要求令牌

若要使用應用程式的身分識別要求令牌,請使用 acquireToken 方法:

IAuthenticationResult result;
     try {
         SilentParameters silentParameters =
                 SilentParameters
                         .builder(SCOPE)
                         .build();

         // try to acquire token silently. This call will fail since the token cache does not
         // have a token for the application you are requesting an access token for
         result = cca.acquireTokenSilently(silentParameters).join();
     } catch (Exception ex) {
         if (ex.getCause() instanceof MsalException) {

             ClientCredentialParameters parameters =
                     ClientCredentialParameters
                             .builder(SCOPE)
                             .build();

             // Try to acquire a token. If successful, you should see
             // the token information printed out to console
             result = cca.acquireToken(parameters).join();
         } else {
             // Handle other exceptions accordingly
             throw ex;
         }
     }
     return result;
其中: 描述
SCOPE 包含所要求的範圍。 對於機密用戶端,這應該使用類似 {Application ID URI}/.default 的格式,表示所要求的範圍是靜態定義於應用程式物件中的範圍(針對 Microsoft Graph,{Application ID URI}指向 )。https://graph.microsoft.com 針對自定義 Web API,{Application ID URI}定義於 應用程式註冊 的 [公開 API] 區段底下

說明與支援 

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

下一步

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