Azure RateCard "AuthenticationFailed" " - PullRequest
       6

Azure RateCard "AuthenticationFailed" "

0 голосов
/ 07 марта 2019

Я хочу получить Azure RateCard через Billing Api с приложением Java. Прежде всего я создаю AccessToken, который работает правильно. Но когда я хочу использовать этот AccessToken для получения RateCard, я получаю ошибку аутентификации. Вот мой код Java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

public class TestingAzure {

public static String getAccessToken(String tenantId, String clientId, String clientSecret)
        throws MalformedURLException, IOException {
    String endpoint = String.format("https://login.microsoftonline.com/%s/oauth2/token", tenantId);
    String postBody = String.format("grant_type=client_credentials&client_id=%s&client_secret=%s&resource=%s",
            clientId, clientSecret, "https://management.azure.com/");
    HttpURLConnection conn = (HttpURLConnection) new URL(endpoint).openConnection();
    conn.setRequestMethod("POST");
    conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setDoOutput(true);
    conn.getOutputStream().write(postBody.getBytes());
    conn.connect();
//      If you want to see the response content, please use the commented code below.
//      BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
//      StringBuilder builder = new StringBuilder();
//      String line = null;
//      while ((line = reader.readLine()) != null) {
//          builder.append(line);
//      }
//      reader.close();
//      System.out.println(builder.toString());
//      The output for access token is {"token_type":"Bearer","expires_in":"3600","ext_expires_in":"3600","expires_on":"1550660092","not_before":"1550656192","resource":"https://management.azure.com/","access_token":"eyJ0eXAiOiJKV1QiL...."}
    JsonFactory factory = new JsonFactory();
    JsonParser parser = factory.createParser(conn.getInputStream());
    String accessToken = null;
    while (parser.nextToken() != JsonToken.END_OBJECT) {
        String name = parser.getCurrentName();
        if ("access_token".equals(name)) {
            parser.nextToken();
            accessToken = parser.getText();
        }
    }
    return accessToken;
}

public static String getRateCard(String subscriptionId, String apiVersion, String offerId, String currency,
        String locale, String region, String accessToken) throws MalformedURLException, IOException {
    String endpoint = String.format(
            "https://management.azure.com/subscriptions/%s/providers/Microsoft.Commerce/RateCard?api-version=%s&$filter=OfferDurableId eq '%s' and Currency eq '%s' and Locale eq '%s' and RegionInfo eq '%s'",
            subscriptionId, apiVersion, offerId, currency, locale, region).replaceAll(" ", "%20");
    HttpURLConnection conn = (HttpURLConnection) new URL(endpoint).openConnection();
    conn.setRequestMethod("GET");
    conn.addRequestProperty("Authorization", "Bearer " + accessToken);
    conn.addRequestProperty("Content-Type", "application/json");
    conn.connect();
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    StringBuilder builder = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
        builder.append(line);
    }
    reader.close();
    return builder.toString();
}

public static void main(String[] args) throws MalformedURLException, IOException {
    String tenantId = "*****";
    String clientId = "*****";
    String clientSecret = "*****";
    clientSecret=java.net.URLEncoder.encode(clientSecret,"UTF-8");
    System.out.println(clientSecret);
    String accessToken = getAccessToken(tenantId, clientId, clientSecret);
    System.out.println(accessToken);
    String subscriptionId = "*****";
    String apiVersion = "2015-06-01-preview";
    String offerId = "****";
    String currency = "EUR";
    String locale = "de-DE";
    String region = "DE";
    String rateCardResp = getRateCard(subscriptionId, apiVersion, offerId, currency, locale, region, accessToken);
    System.out.println(rateCardResp);
}

}

В Eclipse ошибка:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: https://management.azure.com/subscriptions/*subscriptionID*/providers/Microsoft.Commerce/RateCard?api-version=2015-06-01-preview&$filter=OfferDurableId%20eq%20'MS-AZR-0017P'%20and%20Currency%20eq%20'EUR'%20and%20Locale%20eq%20'de-DE'%20and%20RegionInfo%20eq%20'DE'
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
at com.nttdata.altemista.TestingAzure.getRateCard(TestingAzure.java:60)
at com.nttdata.altemista.TestingAzure.main(TestingAzure.java:84)

Когда я ищу URL, я получаю следующее сообщение:

{"error":{"code":"AuthenticationFailed","message":"Fehler bei der Authentifizierung. Der Authorization-Header fehlt."}}

На самом деле у меня была самая высокая роль в работе с этой подпиской. Я не знаю, что я могу попробовать.

1 Ответ

0 голосов
/ 11 марта 2019

В вашем примере вы предоставили достаточное разрешение субъекту службы, то есть разрешение на доступ к API управления службами Windows Azure.

Вот очень хороший пример того, как настроить приложение в Azure AD, если выхотите получить доступ к ресурсам управления в Java

https://blogs.msdn.microsoft.com/azureossds/2015/06/23/authenticating-azure-resource-management-rest-api-requests-using-java/

В качестве альтернативы ниже описано, как настроить собственное приложение для использования Azure Rate card. API-интерфейс Шаг 1. Настройка приложения Native Client в вашемКлиент AAD

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

Чтобы настроить новое приложение AAD:

  1. Войдите на портал Azure, используя учетные данные, которым предоставлен доступ администратора / со-администратора службы для подписки, которая доверяет вашему арендатору AAD, и предоставили доступ глобального администратора в клиенте AAD.См. Управление учетными записями, подписками и административными ролями для получения подробной информации об управлении администратором службы и соадминистраторами.

  2. Выберите арендатора AAD, которого вы хотите использовать, и перейдитена страницу «Приложения».

  3. Оттуда вы можете использовать функцию «Добавить» для «Добавить новое приложение, которое разрабатывает моя организация».

  4. Укажите имя (например: ConsoleApp-Billing-RateCard или аналогичное) для нового приложения.

  5. Убедитесь, что выбран тип «Родное клиентское приложение», затем укажитедействительный URL-адрес для "URI перенаправления" (который может быть http://localhost/ для целей данного примера) и нажмите флажок, чтобы сохранить.

  6. После добавленияновое приложение, выберите его снова в списке приложений и нажмите «Настроить», чтобы вы могли убедиться, что образец приложения будет иметь разрешения на доступ к API-интерфейсам управления службами Windows Azure, то есть разрешению, используемому для защиты API-интерфейсов биллинга.40 *

  7. Прокрутите вниз до раздела «Права доступа к другим приложениям» на странице конфигурации вновь созданного приложения.Затем нажмите кнопку «Добавить приложение», выберите строку «Управление службами Windows Azure» и установите флажок, чтобы сохранить.После сохранения наведите курсор на область «Делегированные разрешения» в правой части строки «Управление службами Windows Azure», щелкните раскрывающийся список «Делегированные разрешения», выберите параметр «Доступ к управлению службами Azure (предварительный просмотр)» и нажмите «Сохраните "снова.

ПРИМЕЧАНИЕ : разрешение" Включить вход в систему и чтение профилей пользователей "в Windows Azure Active Directory включено по умолчанию.Это позволяет пользователям входить в приложение со своими учетными записями организации, позволяя приложению читать профили вошедших в систему пользователей, такие как их адреса электронной почты и контактные данные.Это разрешение на делегирование, которое дает пользователю возможность дать согласие, прежде чем продолжить.Пожалуйста, обратитесь к Добавление, обновление и удаление приложения для более подробной информации о настройке клиента Azure AD, чтобы приложение могло получить доступ к вашему клиенту.

Пока вы находитесь на этой странице, также запишите / скопируйте GUID «Client ID» и «URI перенаправления»,

, так как вы будете использовать их на шаге 3 ниже.Вам также понадобится идентификатор подписки Azure и имя домена клиента AAD, которые вы можете скопировать со страницы «Настройки» на портале управления.

Примечание : - Если вы хотитеиспользуйте grant_type = "Client_credential" и используя идентификатор клиента и client_secret. Убедитесь, что у вас есть хотя бы роль администратора / администратора в подписке, и у вашего приложения есть достаточные разрешения, как указано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...