Microsoft Graph java SDK访问令牌为空
我遵循MS Graph SDK java文档的说明,但我发现错误: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
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();
}
}