Я работаю над настольным приложением, которое использует синхронизацию календаря конференц-зала для создания / обновления и получения сведений о собрании для этого календаря. Это приложение использовало 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 с помощью графического клиента.
Если что-то не так с моим кодом, пожалуйста, ответьте.