HTTPS-запросы Python с использованием токена аутентификации Azure AAD. Или Python-версия CreateAuthorizationHeader () - PullRequest
0 голосов
/ 10 октября 2019

и спасибо вам за полезную помощь.

Я пытаюсь сделать вызов API, используя python. К сожалению, единственная документация API - это реализация, уже существующая в C #.

Моя проблема в том, что после того, как я приобрел объект Azure AADTokenCredential - я просто не знаю, как использовать его в моем HTTPS-запросе.

def get_data_from_api(credentials):
        serialNumber = "123456789"
        fromDate = "01/10/2019 00:00:00" # DD/m/YYYY HH:MM:SS
        untilDate = "09/10/2019 00:00:00" # DD/m/YYYY HH:MM:SS

        PARAMS = {
            serialNumber: serialNumber,
            fromDate: fromDate,
            untilDate: untilDate
        }
        url = "https://myapi.azurewebsites.net/api/sensordata/GetBySerialNumber"
        r = requests.get(url = url, header={"Authorization": credentials}, params=PARAMS)
        print(r)
        #data = r.json()
        return data

Учетные данные - это msrestazure.azure_active_directory. AADTokenCredentials извлекается с использованием пакета adal. Приведенный выше код приводит к ошибке, поскольку объект заголовка может быть только строкой. У меня вопрос - Как правильно передать объект авторизации?

Реализация C # выглядит так:

            // Make a request to get the token from AAD
            AuthenticationResult result = Task.Run(async () => await authContext.AcquireTokenAsync(resource, cc)).Result;

            // Get the auth header which includes the token from the result
            string authHeader = result.CreateAuthorizationHeader();

            // ...

            // Prepare a HTTP request for getting data.
            // First create a client
            HttpClient client = new HttpClient();

            // Create the actual request. It is a GET request so pass the arguments in the url is enough
            HttpRequestMessage request = new HttpRequestMessage(
            HttpMethod.Get, $"https://api.azurewebsites.net/api/sensordata/GetBySerialNumber?serialNumber={serialNumber}&from={fromDate}&until={untilDate}");

            // Add the required authorization header that includes the token. Without it the request will fail as unauthorized
            request.Headers.TryAddWithoutValidation("Authorization", authHeader);

            // Prepare the response object
            HttpResponseMessage response = Task.Run(async () => await client.SendAsync(request)).Result;


1 Ответ

0 голосов
/ 10 октября 2019

Так что да! Я наконец решил это.

Моя проблема заключалась в том, что я передавал объект ADAL на фазу запросов, однако мне нужно было передать фактический токен, который был получен с помощью: 'credentials = context.acquire_token_with_client_credentials(resource_uri,client_id,client_secret)'.

ЗдесьУчетные данные - это словарь, и то, что нужно запросам в заголовке для аутентификации, было:

header = {
    "Authorization": "Bearer "+credentials["accessToken"]
}

r = requests.get(url=url, headers=header, params=PARAMS)

Передача этого в метод questions.get сработал!

...