【问题标题】:Azure Analysis rest api : 401 Unauthorized. "Authentication failed."Azure 分析休息 api:401 未经授权。 “身份验证失败。”
【发布时间】:2019-10-09 00:47:09
【问题描述】:

我正在尝试按照这个 azure 文档进行数据分区刷新(发布):https://docs.microsoft.com/en-us/azure/analysis-services/analysis-services-async-refresh

无论是通过发布还是让我得到 401 Unauthorized(即使服务关闭!)。

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

它与 Analysis Services 管理 rest 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"
  }
 ]
}

我绝望了,你能帮我澄清一下吗?

【问题讨论】:

  • 当服务关闭并且您仍然收到响应时,您正在联系与预期不同的服务。您会收到 401,因为该其他服务使用不同的凭据。
  • 是的,我明白,但我只是使用微软提供的基本 url,我不知道这是怎么发生的......

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


【解决方案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】:

    很可能您的令牌不正确。

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

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

    【讨论】:

      【解决方案3】:

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

      的令牌

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

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

      • 逻辑应用
      • 或使用 Azure 数据工厂

      如果您想查看它们,我都有非常详细的帖子

      【讨论】:

        猜你喜欢
        • 2018-07-09
        • 1970-01-01
        • 2021-09-28
        • 2015-07-16
        • 2016-04-15
        • 2018-01-23
        • 1970-01-01
        • 2013-08-09
        • 1970-01-01
        相关资源
        最近更新 更多