【发布时间】:2021-03-16 05:55:12
【问题描述】:
我正在构建一个应用程序,该应用程序利用 Power BI 服务的 Rest API 来构建 PBI 仪表板。然而,这方面的文档似乎稀疏且不完整。获取访问令牌本身并不太困难。如果您访问任何 PBI Rest API 文档(例如 Push Datasets - Datasets PostDataset)并单击“试用”,您可以在请求预览中找到访问令牌。困难的部分是让您的代码自动检索正确的令牌。
我至少找到了一种方法来完成这项工作,但我从在线论坛复制并粘贴了它,并不完全理解它,并且无法使用应用密码(这是必不可少的)。那段代码是这样的。
def retrieve_access_token(email_address, password, my_org, client_id):
import adal
authority_url = f'https://login.microsoftonline.com/{my_org}.com'
context = adal.AuthenticationContext(
authority_url,
validate_authority=True,
api_version=None
)
token = context.acquire_token_with_username_password(
resource='https://analysis.windows.net/powerbi/api',
username=email_address,
password=password,
client_id=client_id
)
access_token = 'Bearer ' + token['accessToken']
return access_token
我认为该代码来自 MS 文档 Acquire an access token (Python),但该文档没有提供有关“权限”或“资源”值的详细信息,这意味着如果您无法更改此代码以使其更好地工作可以以某种方式让它工作。
我已经基于 YouTube 视频 How to Execute Azure REST APIs with Postman 构建了另一个函数,我认为它使用的方法类似于 MS 文档 Microsoft identity platform and OAuth 2.0 authorization code flow 中概述的方法。该代码能够检索访问令牌,并且我已经为 Azure 应用程序注册配置了 Power BI 可用的所有权限,但它没有从 PBI Rest API 获得任何响应,并且不清楚该令牌的用途。代码是这样的。
def get_access_token(tenant_id, client_id, client_secret):
url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/token"
payload = {'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret,
'resource': 'https://management.azure.com/'}
headers = {'Cookie':
'fpc=Aj6jaa6czgFGoa7atKyYeA7IWmJdAQAAAPp_ctYOAAAA; x-ms-gateway-slice=prod; stsservicecookie=ests'}
response = requests.post(url, headers=headers, data = payload)
return 'Bearer ' + eval(response.text)['access_token']
是否有人知道如何仅通过使用代码(Python,如果可能)来获取适用于 PBI Rest API 的访问令牌,并且有人知道如何获取应用程序密码以使用它吗?至少可以说,从 Python 完成所有这些工作是一场艰苦的战斗,我们将不胜感激。
注意:retrieve_access_token 的 my_org 部分是伪代码。要让它工作,您必须找到您的 login.microsoftonline URL。我通过反复试验发现了这一点,无法为您提供任何进一步的信息。
【问题讨论】:
标签: python oauth powerbi authorization