Microsoft Graph java SDK访问令牌为空

Microsoft Graph java SDK访问令牌为空,java,sdk,microsoft-graph-api,token,microsoft-graph-sdks,Java,Sdk,Microsoft Graph Api,Token,Microsoft Graph Sdks,我遵循MS Graph SDK java文档的说明,但我发现错误: Caused by: com.microsoft.graph.http.GraphServiceException: Error code: InvalidAuthenticationToken Error message: Access token is empty. 由于我正在使用SDK,我不知道令牌有什么问题,因为我没有调用登录,isntead我正在GraphServiceClient中注入tokenCredential

我遵循MS Graph SDK java文档的说明,但我发现错误:

Caused by: com.microsoft.graph.http.GraphServiceException: Error code: InvalidAuthenticationToken
Error message: Access token is empty.
由于我正在使用SDK,我不知道令牌有什么问题,因为我没有调用登录,isntead我正在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();
    }
}
@配置
公共类图形配置{
@豆子
GraphServiceClient GraphServiceClient(){
字符串proxyHost=“proxy.company.com”;
int proxyPort=8080;
//代理配置
最终OkHttpClient httpClient=新OkHttpClient().newBuilder()
.connectTimeout(60,时间单位为秒)
.writeTimeout(60,时间单位。秒)
.readTimeout(60,时间单位为秒)
.proxy(新代理(proxy.Type.HTTP,新InetSocketAddress(proxyHost,proxyPort)))
.build();
final ClientSecretCredential ClientSecretCredential=new ClientSecretCredentialBuilder()
.客户ID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx-XXXXXXXXXX)
.clientSecret(SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
.TENATID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx-XXXXXXXXXXXXXX)
.proxyOptions(新的proxyOptions(proxyOptions.Type.HTTP,新的InetSocketAddress(proxyHost,proxyPort)))
.build();
最终TokenCredentialAuthProvider TokenCredentialAuthProvider=
新的TokenCredentialAuthProvider(Collections.singletonList(“https://graphContact.microsoft.com)、客户保密证书);
返回图ServiceClient
.builder()
.authenticationProvider(TokenCredentialAuthenticationProvider)
.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);

    }
}
@Slf4j
@组成部分
公共类GraphClient{
//Microsoft图形批处理限制
私有静态最终整数批_限制=20;
//微软客户端
私人最终图形服务客户图形服务客户;
/**
*构造函数为连接注入属性
*
*@param graphServiceClient客户端与Microsoft Graph进行交易
*/
公共GraphClient(GraphServiceClient GraphServiceClient){
this.graphServiceClient=graphServiceClient;
}
公共联系人createContactsInFolder(联系人联系人、字符串文件夹ID、Sring用户){
//此方法返回401访问令牌为空
返回图ServiceClient
.用户(用户)
.contactFolders(文件夹ID)
.contacts()
.buildRequest()
·邮政(联络);
}
}

此解决方案适合我:

@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();
    }
}
@配置
公共类图形配置{
@豆子
GraphServiceClient GraphServiceClient(){
字符串proxyHost=“proxy.company.com”;
int proxyPort=8080;
//登录代理客户端
HttpClient credentialsHttpClient=新的NettyAsyncHttpClientBuilder()
.proxy(新的ProxyOptions(ProxyOptions.Type.HTTP,新的InetSocketAddress(proxyHost,proxyPort)))
.build();
final ClientSecretCredential ClientSecretCredential=new ClientSecretCredentialBuilder()
.客户ID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx-XXXXXXXXXX)
.clientSecret(SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
.TENATID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx-XXXXXXXXXXXXXX)
.httpClient(credentialsHttpClient)
.build();
最终TokenCredentialAuthProvider TokenCredentialAuthProvider=
新的TokenCredentialAuthProvider(Collections.singletonList(“https://graphContact.microsoft.com/.default)、客户保密证书);
//API代理客户端
final OkHttpClient httpClient=HttpClients.createDefault(tokenCredentialAuthProvider).newBuilder()
.proxy(新代理(proxy.Type.HTTP,新InetSocketAddress(proxyHost,proxyPort)))
.build();
返回图ServiceClient
.builder()
.httpClient(httpClient)
.buildClient();
}
}