Azure Analysis rest api:401未经授权。 “验证失败。”

时间:2019-05-22 13:47:08

标签: python azure rest api azure-analysis-services

我正在尝试根据这份Azure文档https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-async-refresh

刷新(发布)数据分区。

无论是发布帖子还是获得我未经授权的401(即使服务关闭!)。

我从azure AD(ServicePrincipalCredential)获得了令牌。 我将AD添加为Analysis Services管理员(https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-server-admins) 我将所有者角色授予了Analysis Services IAM中的AD。

它与具有相同认证(分析代码响应200)的Analysis Services管理rest api(https://docs.microsoft.com/en-us/rest/api/analysisservices/operations/list)一起使用

我的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"
  }
 ]
}

我无可救药,请给我一些帮助以使事情变得清楚吗?

3 个答案:

答案 0 :(得分:1)

您的令牌很可能不正确。

您是否尝试过验证令牌?使用类似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

我认为解决方案是尝试更多有意义的事情并遵循错误详细信息。

答案 1 :(得分:1)

最后,我解决了这个问题。 我的令牌错误。该API期望使用OAuth2.0身份验证令牌(Azure分析服务的其余api文档对获取方法的了解并不十分清楚)

对于那些会遇到相同问题的人,有一种方法可以得到。

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

答案 2 :(得分:0)

您需要将资源(受众群体)设置为 https://*.asazure.windows.net

的令牌

对于令牌验证,我喜欢https://jwt.io

此外,如果您想正确地自动执行此操作,则有两个选择

  • 通过 Logic Apps
  • 或使用 Azure Data Factory

关于这两个方面,我都有非常详细的帖子,如果您想查看这些帖子