У меня есть демон, написанный на Java и работающий на AWS. Он вызывает несколько API-интерфейсов Microsoft с использованием токенов на основе идентификатора клиента, секрета клиента и идентификатора клиента для каждой из сотен учетных записей пользователей, которые я поддерживаю. Все отлично работало с MS Azure Active Directory Library для Java (ADAL4J). Но это пока, пока, и поэтому я вынужден перейти в MS Authentication Library для Java (MSAL4J).
По сути, мне нужно использовать идентификатор клиента, секрет и арендатора, чтобы получить accessToken, который требуется для MS API.
После долгих прогулок по примерам (многие из которых компилируются) кажется, что это самый близкий код, который я могу получить:
public static String getToken( String apiUrl,
String clientId,
String clientSecret,
String tenantId,
String authUrl ) {
String token = null ;
if ( !authUrl.endsWith("/")){
authUrl = authUrl + "/" ;
}
/*
NOTE: This is derived from the following:
https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-desktop-acquire-token?tabs=java
I simplified the code by taking out the SilentParameters support.
*/
// BAD: authUrl = authUrl + "organizations/";
// BAD: authUrl = "https://login.microsoftonline.com/" + tenantId + "/";
// BAD: authUrl = "https://login.microsoftonline.com/organizations/";
authUrl = "https://login.microsoftonline.com/organizations/" + tenantId + "/" ;
// BAD: Set<String> SCOPE = Collections.singleton("https://graph.microsoft.com/.default");
// BAD: Set<String> scope = Collections.singleton(clientId);
Set<String> scope = Collections.singleton("");
// Load token cache from file and initialize token cache aspect. The token cache will have
// dummy data, so the acquireTokenSilently call will fail.
ITokenCacheAccessAspect tokenCacheAspect = new TokenPersistence("");
PublicClientApplication pca;
try {
pca = PublicClientApplication
.builder(clientId)
.authority(authUrl)
.setTokenCacheAccessAspect(tokenCacheAspect)
.build();
} catch (MalformedURLException e) {
return null ;
}
IAuthenticationResult result;
/*
BAD: ClientCredentialParameters parameters =
BAD: ClientCredentialParameters
BAD: .builder(SCOPE)
BAD: .build();
*/
UserNamePasswordParameters parameters =
UserNamePasswordParameters
.builder(scope, clientId, clientSecret.toCharArray())
.build();
result = pca.acquireToken(parameters).join();
token = result.accessToken() ;
return token ;
}
Итак, компилирует (даже BAD закомментированный код компилирует) и работает, но генерирует:
com.microsoft.aad.msal4j.MsalClientException: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.microsoft.aad.msal4j.InstanceDiscoveryMetadataEntry]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
Выше генерируется при вызове acquToken (в нижней части).
Я не могу понять, для какого кода нужен конструктор по умолчанию (чтобы сделать JSON счастливым). ОТО, я не знаю, являются ли эти звонками, которые я должен даже делать; Кажется, существует около 47 различных способов пройти через этот материал MSAL, и я совсем не уверен, что нашел «правильный путь».
Помоги мне, Оби-Ван Кеноби. Ты моя единственная надежда!