Ошибка проверки подлинности REST API Azure Devops при использовании Azure Active Directory

Я использую библиотеку Java adal4j для аутентификации вызовов REST API Azure DevOps через Azure Active Directory. Я могу аутентифицироваться с помощью токенов личного доступа, но не с помощью Active Directory. Это код, который я использовал:

AuthenticationResult result = null;
ExecutorService service = null;
try {
  service = Executors.newFixedThreadPool(1);
  AuthenticationContext context = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId + "/", false, service);
  if (clientId != null && clientKey != null) {
    ClientCredential credentials = new ClientCredential(clientId, clientKey);
    Future<AuthenticationResult> future = context.acquireToken("499b84ac-1321-427f-aa17-267ca6975798", credentials, null);
    result = future.get();
  }
} finally {
  if (service != null) {
    service.shutdown();
  }
}

Я получаю следующую ошибку:

StatusCode: 203, ReasonPhrase: «Неавторизованная информация»

Он пытается перенаправить на эту страницу входа:

https://spsprodsin1.vssps.visualstudio.com/_signin?realm=. ..

Я уже подключился к Azure Active Directory из настройки организации Azure DevOps с правильным каталогом / клиентом. И я также добавил разрешения Azure DevOps user_impersonation (делегированные) при регистрации приложения.

Что я здесь делаю не так и как исправить проблему?


person garvit    schedule 15.11.2019    source источник
comment
Привет @garvit. Вы ниже ответили, чтобы исправить проблему. Вы можете принять это, если это сработает.   -  person Levi Lu-MSFT    schedule 22.11.2019


Ответы (1)


введите здесь описание изображения

user_impersonation означает, что этот API можно вызывать только с разрешения пользователя. Однако вы получаете токен с учетными данными клиента, который имеет только разрешение приложения.

Чтобы получить токен для пользователя, вы можете попробовать следующие коды:

    public static AuthenticationResult GetToeknWithPasswordForDevOps(String username, String password){
        ExecutorService service = Executors.newFixedThreadPool(1);
        AuthenticationContext context = null;
        AuthenticationResult result = null;
        try {
            context = new AuthenticationContext(AUTHORITY, true, service);
            Future<AuthenticationResult> future = context.acquireToken("499b84ac-1321-427f-aa17-267ca6975798", "{your publuc app client id}", username, password, null);
            result = future.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } finally {
            service.shutdown();
        }
        return result;
    }
person Jack Jia    schedule 15.11.2019
comment
Большое вам спасибо за ответ. У меня возник еще один вопрос: это имя пользователя / пароль для учетной записи Microsoft или альтернативные учетные данные DevOps или некоторые другие учетные данные Azure Active Directory. @ Джек-цзя - person garvit; 15.11.2019
comment
@garvit Учетные данные Azure AD - person Jack Jia; 15.11.2019