Как использовать MSAL4J для получения токена для демона? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть демон, написанный на 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, и я совсем не уверен, что нашел «правильный путь».

Помоги мне, Оби-Ван Кеноби. Ты моя единственная надежда!

1 Ответ

0 голосов
/ 13 апреля 2020

Оформить MS-идентичность- java -демон демона: https://github.com/Azure-Samples/ms-identity-java-daemon.

...