Анализ Azure rest api: 401 Не авторизован.«Ошибка аутентификации». - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь обновить раздел данных (post), следуя этой документации Azure: https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-async-refresh

Либо с отправкой, либо я получаю 401 Unauthorized (даже когда служба выключена!).

Я получил токен от Azure AD (ServicePrincipalCredential).Я добавил AD в качестве администраторов служб аналитики (https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-server-admins) Я назначил роль владельца AD в службах аналитики IAM.

она работала с остальными API управления службами аналитики (https://docs.microsoft.com/en-us/rest/api/analysisservices/operations/list) С помощьюта же аутентификация (получил код ответа 200)

Мой код Python:

from azure.common.credentials import ServicePrincipalCredentials
import requests

credentials = ServicePrincipalCredentials(client_id="ad_client_id",
                                          secret="ad_secret",
                                          tenant="ad_tenant")
token = credentials.token

url = "https://westeurope.asazure.windows.net/servers/{my_server}/models/{my_model}/refreshes"

test_refresh = {
            "Type": "Full",
            "CommitMode": "transactional",
            "MaxParallelism": 1,
            "RetryCount": 1,
            "Objects": [
                {
                    "table": "my_table",
                    "partition": "my_partition"
                }
            ]
        }

header={'Content-Type':'application/json', 'Authorization': "Bearer {}".format(token['access_token'])}

r = requests.post(url=url, headers=header, data=test_refresh)

import json
print(json.dumps(r.json(), indent=" "))

Ответ, который я получил:

{
 "code": "Unauthorized",
 "subCode": 0,
 "message": "Authentication failed.",
 "timeStamp": "2019-05-22T13:39:03.0322998Z",
 "httpStatusCode": 401,
 "details": [
  {
   "code": "RootActivityId",
   "message": "aab22348-9ba7-42c9-a317-fbc231832f75"
  }
 ]
}

Я безнадежен, не могли бы вы дать мнекто-нибудь поможет прояснить это?

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Наконец-то я решил проблему. У меня был неправильный токен. API ожидают токен аутентификации OAuth2.0 (документация API остальных служб аналитики Azure не совсем ясно, как его получить)

Для тех, кто столкнется с той же проблемой, есть способ получить ее.

from adal import AuthenticationContext

authority = "https://login.windows.net/{AD_tenant_ID}"
auth_context = AuthenticationContext(authority)
oauth_token = auth_context.acquire_token_with_client_credentials(resource="https://westeurope.asazure.windows.net", client_id=AD_client_id, client_secret=AD_client_id)
token = oauth_token['accessToken']

Документация по этому поводу: https://docs.microsoft.com/en-us/python/api/adal/adal.authentication_context.authenticationcontext?view=azure-python#acquire-token-with-client-credentials-resource--client-id--client-secret-

https://github.com/AzureAD/azure-activedirectory-library-for-python/wiki/ADAL-basics

1 голос
/ 23 мая 2019

Скорее всего, ваш токен неверен.

Вы пытались проверить свой токен? Используйте что-то вроде http://calebb.net/

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

credentials = ServicePrincipalCredentials(
    tenant=options['tenant_id'],
    client_id=options['script_service_principal_client_id'],
    secret=options['script_service_principal_secret'],
    resource='https://graph.windows.net'

Хорошие образцы здесь:

https://www.programcreek.com/python/example/103446/azure.common.credentials.ServicePrincipalCredentials

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

...