Использование java для доступа к планировщику Office 365 через график Microsoft - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь получить список задач в планировщике мс. У меня есть некоторый код, который работал с редиректом, который представлял код аутентификации для проверки пользователя через объект PublicClientApplication 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();
}

' ''

Это работает с существующим вызовомBuckets, возвращающим сегменты в плане, определенном planId

Теперь я sh для автоматизации кода с помощью демона, который не требует доступа пользователя и код аутентификации теперь: '' 'publi c 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 http 401 ошибку.

Любая помощь / руководство с благодарностью получено.

Заранее спасибо

1 Ответ

1 голос
/ 09 января 2020

Доступ к планировщику с использованием учетных данных клиента (без доступа пользователя) в настоящее время не поддерживается.

Вы можете проголосовать за него на форумах Microsoft ( Запросы на функции графика Microsoft ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...