我构建了一个 python 应用程序来访问只读 Power BI Rest API。 我正在自动收集租户活动。 然而,尽管配置了我的 Azure 应用程序并使用服务主体生成访问令牌,我从 API 请求收到的响应是未经授权的响应之一:
{"error": {"code": "PowerBINotAuthorizedException", "pbi.error": {"code":
"PowerBINotAuthorizedException", "parameters": {}, "details": [], "exceptionCulprit": 1}}}
我在网上发现了许多类似的问题,但是我觉得我已经完成了建议的所有操作,但仍然无法使其正常工作。 我将不胜感激任何指导。
我采取的步骤是:
配置了Azure App,添加Power Bi Service的应用权限-Tenant.Read.All
使用我的应用程序的 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']}"
配置了我的 Power BI 租户设置以使服务主体能够使用 API。
管理API设置截图
开发者API设置截图
请注意,我将服务主体添加为启用了这两个设置的安全组的成员
执行我对 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()
如有任何帮助,我们将不胜感激!
我刚刚经历了您所描述的这个场景,最后我们不得不联系 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
仅在通过标准委派管理访问令牌进行身份验证时相关。当使用通过服务主体进行身份验证时,不得存在。
为了解决这个问题,您需要删除该权限 --> 嗨,我删除了它,但它抛出一个错误,指出 API 无权访问应用程序,所以我只是向 Tenant.ReadAll 添加了委托权限,它就像一个魅力。我的代码是用powershell