Java 從 ADAL 遷移到 MSAL 的指南

本文重點說明,將使用 Azure Active Directory 認證函式庫(ADAL)的應用程式遷移至 Microsoft 驗證資源庫(MSAL)時,您需要做的變更。

適用於 JAVA 的 Microsoft 驗證程式庫(MSAL4J)與 Azure AD Authentication Library for Java(ADAL4J)皆用於驗證 Microsoft Entra 實體的身分,並向 Microsoft Entra ID 請求權杖。 迄今為止,大多數開發者都是使用 Azure AD for Developer(v1.0)來透過 Azure AD 認證庫(ADAL)請求權杖來驗證各種身份,例如工作和學校帳號。

MSAL 提供以下福利:

  • 由於其使用較新的 Microsoft 身分識別平台,因此您可以驗證更廣泛的 Microsoft 身分,例如 Microsoft Entra 身分、Microsoft 帳戶、透過 Azure AD Business to Consumer(Azure AD B2C)的社交帳戶和本機帳戶,以及透過 Microsoft Entra 外部 ID 的社交或本機客戶帳戶。
  • 您的用戶將獲得最佳的單一登入體驗。
  • 您的應用程式可以啟用增量同意,並支援新功能,例如條件存取。

MSAL for Java 是我們推薦你搭配 Microsoft 身分識別平台 使用的認證函式庫。 ADAL4J 不會實作任何新功能。 今後所有心力都將集中於改進 MSAL。

你可以進一步了解 MSAL,並從 Microsoft 驗證資源庫 的概述開始。

範圍而非資源

ADAL4J 會取得資源的權杖,而 MSAL for Java 則會取得範圍的權杖。 許多 Java 類別的 MSAL 需要一個 scopes 參數。 這個參數是一個字串清單,宣告所請求的權限與資源。 請參閱 Microsoft Graph 的範圍以了解範例範圍。

你可以在資源中加上 /.default 範圍後綴,幫助將應用程式從 ADAL 遷移到 MSAL。 例如,對於資源 https://graph.microsoft.com值,等效的範圍值為 https://graph.microsoft.com/.default。 如果資源不在 URL 表單中,而是表單 XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX的資源 ID,你仍然可以使用範圍值為 XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX/.default

關於不同類型範圍的更多細節,請參閱 Microsoft 身分識別平台 中的權限與同意,以及 Scopes for a Web API accepting v1.0 tokens 文章。

核心課程

在 ADAL4J 中,類別 AuthenticationContext 代表你透過權限機構與安全令牌服務(STS)或授權伺服器的連線。 然而,Java 版 MSAL 是以用戶端應用程式為核心設計的。 它提供兩個獨立的類別: PublicClientApplication 以及 ConfidentialClientApplication 用來表示用戶端應用程式。 後者 ConfidentialClientApplication代表設計用來安全維護秘密的應用程式,例如守護進程應用程式的應用程式識別碼。

下表顯示 ADAL4J 函式如何映射到 Java 函式的新 MSAL:

ADAL4J 方法 MSAL4J 方法
acquireToken(String resource, ClientCredential credential, AuthenticationCallback callback) ClientCredentialParameters
acquireToken(String resource, ClientAssertion assertion, AuthenticationCallback callback) ClientCredentialParameters
acquireToken(String resource, AsymmetricKeyCredential credential, AuthenticationCallback callback) ClientCredentialParameters
acquireToken(字串資源、字串 clientId、字串使用者名稱、字串密碼、AuthenticationCallback 回調) UserNamePasswordParameters
acquireToken(String resource, String clientId, String username, String password=null, AuthenticationCallback callback) IntegratedWindowsAuthenticationParameters
acquireToken(String resource, UserAssertion userAssertion, ClientCredential credential, AuthenticationCallback callback) OnBehalfOfParameters
acquireTokenByAuthorizationCode() AuthorizationCodeParameters
acquireDeviceCode() 與 acquireTokenByDeviceCode() DeviceCodeFlowParameters
acquireTokenByRefreshToken() SilentParameters

IAccount 取代 IUser

ADAL4J 負責使用者。 雖然使用者代表單一的人類或軟體代理,但它可以在 Microsoft 身份系統中擁有一個或多個帳號。 例如,使用者可能擁有多個 Microsoft Entra ID、Azure AD B2C 或 Microsoft 個人帳號。

MSAL for Java 透過 IAccount 介面定義了帳戶的概念。 這是相較於 ADAL4J 的重大變更。 它反映出同一使用者可能擁有多個帳號,甚至可能存在不同的 Microsoft Entra 目錄。 Java 版 MSAL 在訪客情境中提供更好的資訊,因為會提供家庭帳號資訊。

快取持久性

ADAL4J 沒有支援令牌快取。 Java 版 MSAL 新增了 權杖快取,可在可能的情況下自動重新整理已過期的權杖,並避免不必要地提示使用者提供認證,從而簡化權杖生命週期的管理。

共同權威

在 v1.0 版本中,如果你使用權限https://login.microsoftonline.com/common,使用者可以用任何 Microsoft Entra 帳號登入(任何組織皆可)。

如果您在 v2.0 中使用 https://login.microsoftonline.com/common 授權單位,使用者可以使用任何 Microsoft Entra 組織帳戶,甚至 Microsoft 個人帳戶(MSA)登入。 在 Java 的 MSAL 中,如果您想將登入限制為任何 Microsoft Entra 帳戶,請使用 https://login.microsoftonline.com/organizations 授權單位(其行為與 ADAL4J 相同)。 若要指定授權單位,請在具現化 PublicClientApplication 類別時,於 PublicClientApplication.Builder 方法中設定 authority 參數。

v1.0 與 v2.0 權杖

v1.0 端點(由 ADAL 使用)僅發出 v1.0 令牌。

MSAL 使用的 v2.0 端點可以發出 v1.0 和 v2.0 令牌。 Web API 的應用程式清單的一個屬性允許開發者選擇接受的 token 版本。 請參閱accessTokenAcceptedVersion申請清單的參考文件。

欲了解更多關於 v1.0 與 v2.0 令牌的資訊,請參閱 Microsoft Entra 存取令牌

ADAL 至 MSAL 的遷移

在 ADAL4J 中,刷新代幣被公開——讓開發者能夠快取它們。 接著他們會用 AcquireTokenByRefreshToken() 來啟用解決方案,例如實作長期運行的服務,當使用者不再連接時,能代表使用者刷新儀表板。

Java 版 MSAL 出於安全考量不會暴露刷新權杖。 反之,MSAL 會為您處理更新 token。

MSAL for Java 有一個 API,可以讓你將用 ADAL4J 取得的刷新權杖遷移到 ClientApplicationRefreshTokenParameters。 透過這種方法,你可以提供先前使用的刷新令牌以及你想要的任何範圍(資源)。 刷新權杖會被換成新的,並快取供你的應用程式使用。

以下程式碼片段展示了機密客戶端應用程式中的一個簡單的遷移程式碼片段:

String rt = GetCachedRefreshTokenForSignedInUser(); // Get refresh token from where you have them stored
Set<String> scopes = Collections.singleton("SCOPE_FOR_REFRESH_TOKEN");

RefreshTokenParameters parameters = RefreshTokenParameters.builder(scopes, rt).build();

PublicClientApplication app = PublicClientApplication.builder(CLIENT_ID) // ClientId for your application
                .authority(AUTHORITY)  //plug in your authority
                .build();

IAuthenticationResult result = app.acquireToken(parameters);

IAuthenticationResult 會傳回存取權杖和 ID 權杖,而新的重新整理權杖則會儲存在快取中。 應用程式現在也會包含一個 IAccount

Set<IAccount> accounts =  app.getAccounts().join();

要使用目前快取中的標記,請呼叫:

SilentParameters parameters = SilentParameters.builder(scope, accounts.iterator().next()).build();
IAuthenticationResult result = app.acquireToken(parameters);