快速入門:從 JAVA 精靈應用程式取得權杖並呼叫 Microsoft Graph
在本快速入門中,您會下載並執行程式碼範例,該範例會示範 Java 應用程式如何使用應用程式的身分識別來取得存取權杖,以呼叫 Microsoft Graph API 及顯示目錄中的使用者清單。 此程式碼範例會示範自動作業或 Windows 服務如何使用應用程式識別來執行,而不是以使用者的身分識別執行。
必要條件
若要執行此範例,您需要:
- Java 開發套件 (JDK) 8 或更新版本
- Maven
註冊並下載快速入門應用程式
提示
根據您開始使用的入口網站,本文中的步驟可能略有不同。
步驟 1:註冊應用程式
若要手動註冊您的應用程式,並將應用程式註冊資訊新增到您的解決方案,請執行下列步驟:
- 至少以應用程式開發人員的身分登入 Microsoft Entra 系統管理中心。
- 如果您有多個租用戶的存取權,請使用頂端功能表中的 [設定] 圖示 ,從 [目錄 + 訂用帳戶] 功能表來切換要在其中註冊應用程式的租用戶。
- 瀏覽至 [身分識別]>[應用程式]>[應用程式註冊]。
- 選取新增註冊。
- 輸入應用程式的名稱,例如
Daemon-console
。 您的應用程式使用者可能會看到此名稱,而且您稍後可以加以變更。 - 選取註冊。
- 在 [管理] 下,選取 [憑證和密碼]。
- 在 [用戶端密碼] 底下,選取 [新增用戶端密碼] 並輸入名稱,然後選取 [新增]。 將祕密值記錄在安全的位置,以便在稍後的步驟中使用。
- 在 [管理] 底下,選取 [API 權限]>[新增權限]。 選取 [Microsoft Graph]。
- 選取應用程式權限。
- 在 [使用者] 節點底下,選取 [User.Read.All],然後選取 [新增權限]。
步驟 2:下載 Java 專案
步驟 3:設定 Java 專案
- 將 zip 檔案解壓縮至接近磁碟根資料夾的本機資料夾,例如
C:\Azure-Samples
。 - 瀏覽至
msal-client-credential-secret
子資料夾。 - 編輯
src\main\resources\application.properties
,並將欄位AUTHORITY
、CLIENT_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 所建立的用戶端密碼。
提示
若要尋找 [應用程式 (用戶端) 識別碼]、[目錄 (租用戶) 識別碼] 的值,請移至應用程式的 [概觀] 頁面。 若要產生新的金鑰,請移至 [憑證和祕密] 頁面。
步驟 4:管理員同意
如果您嘗試在此時執行應用程式,您將會收到「HTTP 403 - 禁止」錯誤:Insufficient privileges to complete the operation
。 之所以發生此錯誤,是因為任何 [僅限應用程式權限] 都需要管理員同意:目錄的全域管理員必須對應用程式表示同意。 請根據您的角色選取下列其中一個選項:
全域租用戶管理員
如果您是全域租用戶管理員,請移至 [應用程式註冊]中的 [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:執行應用程式
您可以從 IDE 執行 ClientCredentialGrant.java 的 main 方法,直接測試範例。
從殼層或命令列:
$ mvn clean compile assembly:single
這會在您的 /targets
目錄中產生 msal-client-credential-secret-1.0.0.jar
檔案。 使用您的 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 與精靈應用程式的詳細資訊,請參閱這篇文章。
請對應用程式中的 pom.xml (Maven) 或 build.gradle (Gradle) 檔案進行下列變更,以使用 Maven 或 Gradle 來管理您的相依性,進而將 MSAL4J 新增至您的應用程式。
在 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 的檔案頂端,以將參考新增至 MSAL for Java:
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] 區段底下。 |
說明與支援
如果您需要協助、想要回報問題,或想要深入了解您的支援選項,請參閱 開發人員的協助與支援。
下一步
若要深入了解精靈應用程式,請參閱案例登陸頁面。