java - 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);
}
}
解决方案
这个解决方案对我有用:
@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();
}
}
推荐阅读
- javascript - Javascript 中的 clientX、pageX、screenX、offsetX、offsetLeft、movementX
- solace - 我们可以将主题附加到临时队列中吗?
- ngx-bootstrap - 在本地构建 ngx-bootstrap
- oracle - 如何在 PL/SQL 中使用多列遍历 dict 以从中获取值并将它们注入查询中的 where 语句
- android - Android:如何在材质工具栏中更改后退按钮的颜色、字体系列和标题的文本大小?
- c# - 比较属性在发布时失败
- excel - 在一行代码中选择所有对象
- machine-learning - 在一个分类变量中处理(过多)类的最佳方法
- vb.net - 为什么序列号在 DataGridView 中消失了?
- firebase - 我如何允许用户仅修改自己的文件 Firebase 存储?