You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用MSAL4j生成的IAuthenticationResult创建Graph客户端?

从ADAL迁移到MSAL4j后对接Microsoft Graph Java SDK的解决方案

核心思路

MSAL4j返回的IAuthenticationResult是单次获取的令牌结果,而Graph SDK需要的IAuthenticationProvider是一个能按需提供有效令牌的提供者。解决办法是自定义实现IAuthenticationProvider接口,在内部集成MSAL4j的客户端凭据流程,让Graph客户端自动调用它获取/刷新令牌。

具体实现步骤

1. 确保依赖齐全

如果用Maven,添加以下依赖到pom.xml:

<!-- MSAL4j -->
<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>msal4j</artifactId>
    <version>1.14.0</version> <!-- 使用最新稳定版 -->
</dependency>
<!-- Microsoft Graph Java SDK -->
<dependency>
    <groupId>com.microsoft.graph</groupId>
    <artifactId>microsoft-graph</artifactId>
    <version>6.3.0</version> <!-- 使用最新稳定版 -->
</dependency>

2. 自定义MSAL身份验证提供者

实现IAuthenticationProvider接口,内部封装MSAL4j的ConfidentialClientApplication,负责令牌的获取和自动刷新:

import com.microsoft.graph.authentication.IAuthenticationProvider;
import com.microsoft.aad.msal4j.*;
import java.util.Collections;
import java.util.concurrent.CompletableFuture;

public class MsalClientCredentialAuthProvider implements IAuthenticationProvider {
    private final ConfidentialClientApplication confidentialClient;
    private final String[] scopes;

    // 构造函数:传入客户端ID、客户端密钥、租户ID和Graph权限范围
    public MsalClientCredentialAuthProvider(String clientId, String clientSecret, String tenantId, String[] scopes) throws MalformedURLException {
        this.scopes = scopes;
        // 初始化MSAL的机密客户端
        this.confidentialClient = ConfidentialClientApplication.builder(
                        clientId,
                        ClientCredentialFactory.createFromSecret(clientSecret))
                .authority(String.format("https://login.microsoftonline.com/%s", tenantId))
                .build();
    }

    @Override
    public CompletableFuture<String> getAuthorizationTokenAsync(String url) {
        // 当Graph客户端需要令牌时,调用MSAL获取客户端凭据模式的令牌
        return confidentialClient.acquireToken(
                        ClientCredentialParameters.builder(Collections.singletonList(scopes[0])).build())
                .thenApply(IAuthenticationResult::accessToken);
    }
}

3. 创建Graph客户端实例

使用自定义的身份验证提供者构建Graph客户端:

import com.microsoft.graph.requests.GraphServiceClient;
import okhttp3.OkHttpClient;
import com.microsoft.aad.msal4j.MalformedURLException;

public class GraphClientBuilder {
    public static GraphServiceClient<OkHttpRequest> getGraphClient() throws MalformedURLException {
        // 配置你的应用信息
        String clientId = "你的客户端ID";
        String clientSecret = "你的客户端密钥";
        String tenantId = "你的租户ID";
        // 客户端凭据模式下,使用/.default范围
        String[] scopes = {"https://graph.microsoft.com/.default"};

        // 初始化自定义身份验证提供者
        IAuthenticationProvider authProvider = new MsalClientCredentialAuthProvider(clientId, clientSecret, tenantId, scopes);

        // 构建并返回Graph客户端
        return GraphServiceClient.builder()
                .authenticationProvider(authProvider)
                .buildClient();
    }
}

关键说明

  • MSAL4j会自动处理令牌的缓存和过期刷新,不需要手动管理IAuthenticationResult的生命周期,确保Graph客户端始终能拿到有效令牌。
  • 如果已经手动获取了IAuthenticationResult,也可以在自定义提供者中直接返回其accessToken,但这种方式无法自动刷新令牌,不推荐在生产环境使用。

内容的提问来源于stack exchange,提问作者Vrushabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:12:27