Power BI Rest API 请求未按预期授权

问题描述 投票:0回答:2

我构建了一个 python 应用程序来访问只读 Power BI Rest API。 我正在自动收集租户活动。 然而,尽管配置了我的 Azure 应用程序并使用服务主体生成访问令牌,我从 API 请求收到的响应是未经授权的响应之一:

{"error": {"code": "PowerBINotAuthorizedException", "pbi.error": {"code": 
"PowerBINotAuthorizedException", "parameters": {}, "details": [], "exceptionCulprit": 1}}}

我在网上发现了许多类似的问题,但是我觉得我已经完成了建议的所有操作,但仍然无法使其正常工作。 我将不胜感激任何指导。

我采取的步骤是:

  1. 配置了Azure App,添加Power Bi Service的应用权限-Tenant.Read.All

    Azure 门户中的应用程序设置屏幕截图

  2. 使用我的应用程序的 client_ID 和 client_Secret 根据客户端凭据流程请求我的访问令牌,如以下链接中所述:
    https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow

我使用以下脚本成功接收了令牌:

import requests

azureTenantID = "xxxxxxxxxxxxxxxxx"
azureClientId = "xxxxxxxxxxxxxxxxx"
azureClientSecret = "xxxxxxxxxxxxxxxxxx"

url = f"https://login.microsoftonline.com/{azureTenantID}/oauth2/v2.0/token"

payload = {
        "grant_type": "client_credentials",
        "client_id": azureClientId, 
        "client_secret": azureClientSecret,
        "scope": "https://analysis.windows.net/powerbi/api/.default"            
}
# Header HAS to be x-www-form-urlencoded for MS to accept it.
headers = {'Content-Type': 'application/x-www-form-urlencoded'}

# Return POST content as JSON.
r = requests.post(url, data=payload, headers=headers).json()

# Grab the access token.
response = r.get("access_token")

# Concatenate with Bearer string
access_token = "Bearer {r['access_token']}"  
  1. 配置了我的 Power BI 租户设置以使服务主体能够使用 API。
    管理API设置截图
    开发者API设置截图
    请注意,我将服务主体添加为启用了这两个设置的安全组的成员

  2. 执行我对 API 的 Get 请求

当我从 Power BI REST API 文档的“试用”功能中获取访问令牌时,以下脚本会返回良好的响应,但当我按上述方式生成令牌时,则不会返回良好的响应。

import requests

# Initialise parameters.
url = "https://api.powerbi.com/v1.0/myorg/admin/groups?$top=1000&$expand=datasets,dataflows,reports,users,dashboards"
headers = {'Authorization': get_access_token2()}

# Get response.
response = requests.get(url, headers=headers)
response = response.json()

如有任何帮助,我们将不胜感激!

python api powerbi
2个回答
3
投票

我刚刚经历了您所描述的这个场景,最后我们不得不联系 Microsoft 支持来解决它。

虽然非常违反直觉,但如果您为服务主体身份验证创建的应用程序分配了任何 Power BI 权限,则生成的访问令牌(当传递到 Power BI REST Admin API 时)将返回一个错误响应,报告

PowerBINotAuthorizedException
.

更具体地说,如果您传递给 Power BI API 的访问令牌具有

roles
键/值对,那么您将获得
PowerBINotAuthorizedException

就您而言,问题更容易,因为您已经列出了您授予的权限。你提到你

Configured an Azure App, adding the Application Permission for Power Bi Service-Tenant.Read.All
为了解决此问题,您需要删除该权限。

对于未来的读者,您可以通过使用 JWT 令牌解码器(如在 jstoolset.com 上找到的解码器)解码访问令牌来解决此问题。如果您的应用程序已分配给您请求的范围的权限(https://analysis.windows.net/powerbi/api/.default是您在授权中请求的典型 Power BI 范围)并且您对 JWT 进行解码令牌,然后您将看到一个

roles
键/值对。这个
roles
的存在本质上就是问题所在。那里的值可能与
Power BI REST Admin API 文档
中的 Required Scope 匹配并不重要。我们向我们描述,好像您的访问令牌中有一个
roles
值,然后当该令牌提供给 Power BI API 时,会尝试使用授予的角色,这最终会导致
PowerBINotAuthorizedException
,因为服务校长不允许使用某个角色。

如果您有一个已删除所有权限的应用程序,但在

roles
键/值对的访问令牌中仍然有一个值,那么我建议从一个没有分配任何权限的新应用程序开始,然后只需将新应用程序添加到您最初创建的现有安全组即可。这就是我们如何意识到这确实是问题所在,然后能够从那里进行协调。

编辑:Microsoft 现已更新相关端点上的 API 文档以反映此信息。例如,在 Admin - Groups GetGroupUsersAsAdmin 中,Required Scope 现在显示为:

租户.Read.All 或租户.ReadWrite.All

仅在通过标准委派管理访问令牌进行身份验证时相关。当使用通过服务主体进行身份验证时,不得存在。


0
投票

为了解决这个问题,您需要删除该权限 --> 嗨,我删除了它,但它抛出一个错误,指出 API 无权访问应用程序,所以我只是向 Tenant.ReadAll 添加了委托权限,它就像一个魅力。我的代码是用powershell

© www.soinside.com 2019 - 2024. All rights reserved.