首页 > 解决方案 > Microsoft Graph java SDK 访问令牌为空

问题描述

我按照 MS Graph SDK java 文档的说明进行操作,但出现错误:

Caused by: com.microsoft.graph.http.GraphServiceException: Error code: InvalidAuthenticationToken
Error message: Access token is empty.

当我使用 SDK 时,我不知道令牌有什么问题,因为我没有调用登录,而是我在 GraphServiceClient 中注入 tokenCredentialAuthProvider 来进行调用。

我的图表配置:

@Configuration
public class GraphConfig {

    @Bean
    GraphServiceClient<Request> graphServiceClient() {
        String proxyHost = "proxy.company.com";
        int proxyPort = 8080;
        //PROXY CONF
        final OkHttpClient httpClient = new OkHttpClient().newBuilder()
                .connectTimeout(60, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS)
                .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)))
                .build();

        final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
                .clientId(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
                .clientSecret(ssssssssssssssssssssssssssssssssssss)
                .tenantId(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
                .proxyOptions(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)))
                .build();

        final TokenCredentialAuthProvider tokenCredentialAuthProvider =
                new TokenCredentialAuthProvider(Collections.singletonList("https://graphContact.microsoft.com"), clientSecretCredential);

        return GraphServiceClient
                .builder()
                .authenticationProvider(tokenCredentialAuthProvider)
                .httpClient(httpClient)
                .buildClient();
    }
}

类使用客户端调用图与SDK

@Slf4j
@Component
public class GraphClient {
    // Microsoft Graph Batch Limit
    private static final Integer BATCH_LIMIT = 20;
    // Microsoft Client
    private final GraphServiceClient<?> graphServiceClient;

    /**
     * Constructor injecting properties for connection
     *
     * @param graphServiceClient client to deal wtih Microsoft Graph
     */
    public GraphClient(GraphServiceClient<Request> graphServiceClient) {
        this.graphServiceClient = graphServiceClient;

    }

    public Contact createContactsInFolder(Contact contact, String folderId, Sring user) {
// THIS METHOD RETURNS 401 Access token is empty
        return graphServiceClient
           .users(user)
           .contactFolders(folderId)
           .contacts()
           .buildRequest()
           .post(contact);

    }
}

标签: javasdkmicrosoft-graph-apitokenmicrosoft-graph-sdks

解决方案


这个解决方案对我有用:

@Configuration
public class GraphConfig {

    @Bean
    GraphServiceClient<Request> graphServiceClient() {
        String proxyHost = "proxy.company.com";
        int proxyPort = 8080;

        //LOGIN PROXY CLIENT
        HttpClient credentialsHttpClient = new NettyAsyncHttpClientBuilder()
                .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)))
                .build();

        final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
                .clientId(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
                .clientSecret(ssssssssssssssssssssssssssssssssssss)
                .tenantId(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
                .httpClient(credentialsHttpClient)
                .build();

        final TokenCredentialAuthProvider tokenCredentialAuthProvider =
                new TokenCredentialAuthProvider(Collections.singletonList("https://graphContact.microsoft.com/.default"), clientSecretCredential);

        // API PROXY CLIENT
        final OkHttpClient httpClient = HttpClients.createDefault(tokenCredentialAuthProvider).newBuilder()
            .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)))
            .build();

        return GraphServiceClient
                .builder()
                .httpClient(httpClient)
                .buildClient();
    }
}

推荐阅读