Кэширование токена доступа Microsoft Graph - PullRequest
0 голосов
/ 18 июня 2020

Я работаю над настольным приложением, которое использует синхронизацию календаря конференц-зала для создания / обновления и получения сведений о собрании для этого календаря. Это приложение использовало API EWS, и теперь я пытаюсь перенести его на график Microsoft. Поскольку это настольное приложение, взаимодействие с пользователем не будет особенным, если приложению будут предоставлены все данные (clientID, tenantID, clientSecret) для подключения к графику Microsoft.

Теперь я использую эти данные для получить токен доступа из графа Microsoft. Проблема в том, что я не кэширую полученный токен доступа, поэтому мне приходится делать несколько вызовов для получения токена доступа для каждого вызова. Я думал сохранить кеш в HashMap и обновлять его каждый раз, когда он истекает. Я видел некоторый подход к кешированию для токена доступа к графу, но не смог его реализовать.

Ниже мой код:

public String getTokenUsingGraphClientSecret(String clientId, String tenantId, String clientSecret) throws Exception {

        String authority = MessageFormat.format(AUTHORITY_URL, tenantId);
        IClientCredential credential = ClientCredentialFactory.createFromSecret(clientSecret);
        ConfidentialClientApplication cca = ConfidentialClientApplication.builder(clientId, credential)
                .authority(authority)
                // .setTokenCacheAccessAspect(tokenCacheAspect)
                .build();

        IAuthenticationResult result;
        try {
            SilentParameters silentParameters = SilentParameters.builder(SCOPE).build();

            result = cca.acquireTokenSilently(silentParameters).join();
        } catch (Exception ex) {
            if (ex.getCause() instanceof MsalException) {

                ClientCredentialParameters parameters = ClientCredentialParameters.builder(SCOPE).build();
                result = cca.acquireToken(parameters).join();
            } else {
                log.error("Exception occurred while fetching access token using getTokenUsingGraphCertificate. ERROR is : {}",ex);
                throw ex;
            }
        }
        return result.accessToken();
    }

.setTokenCacheAccessAspect (tokenCacheAspect) закомментирован, потому что я не уверен как это использовать. И используя указанный выше токен доступа для создания graphClient:

public IGraphServiceClient createGraphClient(String accessToken) {

        IGraphServiceClient graphClient = null;
        try {
            AuthProvider authProvider = new AuthProvider(accessToken);
            graphClient = GraphServiceClient.builder().authenticationProvider(authProvider).buildClient();

        } catch (Exception e) {
            log.debug("Exception in creating GraphClient. ERROR is {} : ", e);
        }
        return graphClient;
    }

Токен получения всегда автоматически завершается сбоем, и токен приобретается с помощью result = cca.acquireToken (parameters) .join ();

Я удалю result = cca.acquireTokenSilently (silentParameters) .join (); поскольку он всегда терпит неудачу.

Если бы я мог хранить / кэшировать токен доступа таким образом, чтобы я мог использовать то же самое для создания graphClient, пока он не истечет.

Пожалуйста, помогите мне с образцом кода для кеширования в java и как его можно использовать в дальнейших вызовах API с помощью графического клиента.

Если что-то не так с моим кодом, пожалуйста, ответьте.

...