使用 java 通过 Microsoft Graph 访问 Office 365 Planner



我正在尝试在ms计划器中获取任务列表。 我有一些使用重定向的代码,它提供了一个身份验证代码,通过ms java api公共客户端应用程序对象验证用户。

'''

///
///   Already defined after registering an application in azure AD
///    private static String applicationId;
///    private static String tennantId;
///
public String getUserAccessToken(String[] scopes)  {
try {
PublicClientApplication app;
try {
// Build the MSAL application object with
// app ID and authority
String authority = "https://login.microsoftonline.com/";
app = PublicClientApplication.builder(applicationId)
.authority(authority + tennantId + "/")
.build();
} catch (MalformedURLException e) {
return null;
}
// Create consumer to receive the DeviceCode object
// This method gets executed during the flow and provides
// the URL the user logs into and the device code to enter
Consumer<DeviceCode> deviceCodeConsumer = (DeviceCode deviceCode) -> {
span.log(ImmutableMap.of("event", "o365-initialise-authentication-device-code-check", "", ""));
// Print the login information to the console
System.out.println(deviceCode.message());
};
// Request a token, passing the requested permission scopes
IAuthenticationResult result = app.acquireToken(
DeviceCodeFlowParameters
.builder(scopeSet, deviceCodeConsumer)
.build()
).exceptionally(ex -> {
return null;
}).join();
if (result != null) {
return result.accessToken();
}
return null;
}
public void getPlan(string planId)
{
// Build a Graph client
graphClient = GraphServiceClient.builder()
.authenticationProvider((IAuthenticationProvider) authProvider)
.logger(logger)
.buildClient();
PlannerBucketCollectionPage existingBuckets = graphClient.planner().plans(planId).buckets().buildRequest().get();
}

'''

这适用于现有存储桶调用,返回由 planId 定义的计划中

存储桶我现在希望通过不需要用户访问权限的守护程序自动执行代码,身份验证代码现在是: ''' public String getUserAccessToken(String[] scopes( {

try {
// Create default logger to only log errors
DefaultLogger logger = new DefaultLogger();
logger.setLoggingLevel(LoggerLevel.DEBUG);
ConfidentialClientApplication app = ConfidentialClientApplication.builder(
applicationId,
ClientCredentialFactory.create(key))
.authority(authority + tennantId + "/")
.build();
ClientCredentialParameters clientCredentialParam = ClientCredentialParameters.builder(
Collections.singleton(GRAPH_DEFAULT_SCOPE))
.build();
CompletableFuture<IAuthenticationResult> future = app.acquireToken(clientCredentialParam);
BiConsumer<IAuthenticationResult, Throwable> processAuthResult = (res, ex) -> {
if (ex != null) {
System.out.println("Oops! We have an exception - " + ex.getMessage());
}
else
{
System.out.println("Returned ok - " + res);
System.out.println("Access Token - " + res.accessToken());
System.out.println("ID Token - " + res.idToken());
}
};
future.whenCompleteAsync(processAuthResult);
future.join();
CompletableFuture<Set<IAccount>> accountsRequest = app.getAccounts();
BiConsumer<Set<IAccount>, Throwable> processAccountsResult = (res, ex) -> {
if (ex != null) {
System.out.println("Oops! We have an exception - " + ex.getMessage());
}
if ( res == null )
{
System.out.println("No accounts");
}
else
{
log.info("Found "+ res.size() + " accounts");
}
};
accountsRequest.whenCompleteAsync(processAccountsResult);
CompletableFuture<IAuthenticationResult> future1;
try {
future1 = app.acquireTokenSilently
(SilentParameters.builder(Collections.singleton(GRAPH_DEFAULT_SCOPE),
null)
.forceRefresh(true)
.build());
} catch (MalformedURLException e) {
e.printStackTrace();
throw new RuntimeException();
}
future1.join();
IAccount account = app.getAccounts().join().iterator().next();
app.removeAccount(account).join();
return future.get().accessToken();
}
catch ( Exception ex)
{
log.error("Unable to get O365 token", ex);
}
return null;
}

'''

但是,帐户对象为空,如果我跳过 future1 调用,则会收到 http 错误 401。

任何帮助/指导感激地收到。

提前致谢

目前不支持使用客户端凭据(无用户访问权限(访问计划器。

您可以在Microsoft论坛上投票(Microsoft图形功能请求(。

最新更新