无法获取客户端凭据访问令牌来授权 Power BI

Posted

技术标签:

【中文标题】无法获取客户端凭据访问令牌来授权 Power BI【英文标题】:Can't get client-credentials access token to authorize Power BI 【发布时间】:2015-11-27 07:06:21 【问题描述】:

我正在尝试使用 Power BI REST API,使用通过“客户端凭据”方法获取的访问令牌,但我的请求中不断收到 403 Forbidden

我的代码遵循this AzureAD sample 中演示的模式。事实上,为了隔离这个问题,我正在运行该示例代码(当然,在parameters.json 中使用我自己的值):

 
  expiresIn: 3599,
  tokenType: 'Bearer',
  expiresOn: Tue Sep 01 2015 16:56:07 GMT-0500 (CDT),
  resource: '00000002-0000-0000-c000-000000000000',
  accessToken: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSIsImtpZCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSJ9.eyJhdWQiOiIwMDAwMDAwMi0wMDAwLTAwMDAtYzAwMC0wMDAwMDAwMDAwMDAiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC8xM2QxNzIwNC0wZGU2LTQ1NzQtOTgzYS05NjFhYjk0M2M3Y2UvIiwiaWF0IjoxNDQxMTQwNjcwLCJuYmYiOjE0NDExNDA2NzAsImV4cCI6MTQ0MTE0NDU3MCwidmVyIjoiMS4wIiwidGlkIjoiMTNkMTcyMDQtMGRlNi00NTc0LTk4M2EtOTYxYWI5NDNjN2NlIiwib2lkIjoiYzM1ZWQyYTktYTYzZS00YzAwLThmYmYtY2FlYjlmZjYwMjYwIiwic3ViIjoiYzM1ZWQyYTktYTYzZS00YzAwLThmYmYtY2FlYjlmZjYwMjYwIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvMTNkMTcyMDQtMGRlNi00NTc0LTk4M2EtOTYxYWI5NDNjN2NlLyIsImFwcGlkIjoiNDQ2Y2Y5OTItMDQzYS00YjgxLWJhYzQtY2RlZWYyNGFhNzFjIiwiYXBwaWRhY3IiOiIxIn0.YTGJfdW1wP09bDHwwsv3FPAmEpmQdc_kifvgY-1KjhkZWANfYtd050wfeZdNgMUeSPZyFdWnoBjnJ4xrlDtnsADwV1Grr6TXYcymPLofbY-xy0cjyvzxTmM11DJ9XN8A4tkgvK0jtR-YyIjPw5EKJSKyeEbD9U3mWsE_gu7IzKzXl8e-dfVAqRYS6WHZy6_0FaNmppPDls5s_QIPOHofFSiWVISw41Mz0fQnP2QEGyceOCvKYJtrUOCDwfVuwFS-gSLmYvEGOJfmIjftP3srda0JPirVzBeU0IFJJ1KW81kE5cfKw1KkBB04VVetRUs_7HqloYaKKiTybauhXAodRQ',
  isMRRT: true,
  _clientId: '[snip]',
  _authority: 'https://login.windows.net/[snip]' 

当我在curl 请求中使用该访问令牌时,如下所示,我得到一个403

curl -vv -X GET https://api.powerbi.com/v1.0/myorg/datasets -H"Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSIsImtpZCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSJ9.eyJhdWQiOiIwMDAwMDAwMi0wMDAwLTAwMDAtYzAwMC0wMDAwMDAwMDAwMDAiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC8xM2QxNzIwNC0wZGU2LTQ1NzQtOTgzYS05NjFhYjk0M2M3Y2UvIiwiaWF0IjoxNDQxMTQwNjcwLCJuYmYiOjE0NDExNDA2NzAsImV4cCI6MTQ0MTE0NDU3MCwidmVyIjoiMS4wIiwidGlkIjoiMTNkMTcyMDQtMGRlNi00NTc0LTk4M2EtOTYxYWI5NDNjN2NlIiwib2lkIjoiYzM1ZWQyYTktYTYzZS00YzAwLThmYmYtY2FlYjlmZjYwMjYwIiwic3ViIjoiYzM1ZWQyYTktYTYzZS00YzAwLThmYmYtY2FlYjlmZjYwMjYwIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvMTNkMTcyMDQtMGRlNi00NTc0LTk4M2EtOTYxYWI5NDNjN2NlLyIsImFwcGlkIjoiNDQ2Y2Y5OTItMDQzYS00YjgxLWJhYzQtY2RlZWYyNGFhNzFjIiwiYXBwaWRhY3IiOiIxIn0.YTGJfdW1wP09bDHwwsv3FPAmEpmQdc_kifvgY-1KjhkZWANfYtd050wfeZdNgMUeSPZyFdWnoBjnJ4xrlDtnsADwV1Grr6TXYcymPLofbY-xy0cjyvzxTmM11DJ9XN8A4tkgvK0jtR-YyIjPw5EKJSKyeEbD9U3mWsE_gu7IzKzXl8e-dfVAqRYS6WHZy6_0FaNmppPDls5s_QIPOHofFSiWVISw41Mz0fQnP2QEGyceOCvKYJtrUOCDwfVuwFS-gSLmYvEGOJfmIjftP3srda0JPirVzBeU0IFJJ1KW81kE5cfKw1KkBB04VVetRUs_7HqloYaKKiTybauhXAodRQ"

想知道 curl 请求是否存在某种缺陷,我通过浏览器 webtools snooped out an access token “the wrong way”,上面的工作正常,返回一个 200 和一个列出我的数据集的 JSON 响应。

我也注意到返回码是403(禁止),而不是401(未授权),所以我想知道授权是否正常但Power BI端的权限错误。但是当我使用任何垃圾文本作为访问令牌(例如,Authorization: Bearer foo)时,我也会得到403,所以我放弃了这个理论。

所以。我想我有一个有效的测试,并且我得到了我认为是有效的访问令牌(来自 client-credentials-sample.js 代码),但它仍然无法正常工作。我错过了什么?

【问题讨论】:

把你的代码发给我,我会为你调试bit.ly/emailjon。我在 power bi 团队。 这太荒谬了。使用 REST Api 是我见过的最麻烦的事情。通常只需单击几下即可获得密钥或令牌,几分钟内您就可以通过邮递员获得结果。为什么 PBI 团队不能像许多其他人一样建立一个简单的网页来自动启用 api 并根据真实帐户凭据生成示例调用? 【参考方案1】:

确保您在 AAD 中注册的应用具有读写所有数据集的权限。这应该可以解决问题。

【讨论】:

查看 Azure Active Directory,在此“应用程序”的“配置”选项卡上,“对其他应用程序的权限”下有“Power BI 服务”。它显示“应用程序权限:0”(该箭头不会弹出任何要更改的内容)和“委派权限:7”(该下拉菜单显示所有框已选中,包括“读取和写入所有数据集(预览版)”)。这是在上述测试之前已经设置好的;我还没有改变任何东西。我找对地方了吗? 我已经破解了您在上面示例中拥有的令牌。我没有在其中看到这些权限。首先要检查的是您使用的应用 ID 与您在 AAD 中检查的应用 ID 相同。如果是,这是 Web 应用还是原生应用? 嗯,我不确定“应用程序 ID”是什么?在 Azure 中哪里可以找到和/或在客户端设置它?我确实匹配了我在clientId 上的查找,这是一样的。这是一个网络应用程序。至少,它正在努力成为。 :-) 是的。客户 ID 相同。请试试这个:去portal.office.com/myapps。找到您的应用程序并将其删除。然后尝试再次运行您的应用程序。它应该要求您再次同意。【参考方案2】:

这不是一个答案,而是在调试过程中向前迈出的一步。我认为请求令牌的资源应该是“https://analysis.windows.net/powerbi/api”。我在多个参考资料中看到过这些;其中之一链接如下。即使在更改此设置后,我仍然得到 403。正如 OP 所述,如果我们使用 powerBI 门户中的 accessToken,一切正常。

【讨论】:

当我尝试以任何方式访问analysis.windows.net 时,我得到“找不到服务器”。也不清楚您建议在哪里使用该 URL。作为“授权主机 URL”(如 here?还是作为实际 BI 请求的目标(如我原来的 curl 示例中)? 这应该是您请求令牌的“资源”属性的值。这是我正在使用的 nodejs 示例。这代替了您当前使用的值“00000009-0000-0000-c000-000000000000”。【参考方案3】:

所以我用自己的应用程序尝试了这个,以下命令有效(对我来说):

curl -vv -X GET https://api.powerbi.com/v1.0/myorg/datasets -H"Authorization: Bearer ey....qqqq"

顺便说一句,-v 之后多余的“v”似乎是多余的。

所以我可以得出的结论是,您的应用程序缺少调用 Power BI API 所需的权限。

您可以尝试的一件事是获取我们的一个示例,在 AAD 中为其创建一个新应用程序,然后查看授权令牌是否适用于它。这是一个很好的尝试:https://github.com/PowerBI/Integrate-a-tile-into-an-app

【讨论】:

是的,我的-vv 是对的。在某个地方,我认为curl 是那些增加更多vs 的命令之一,但nope。【参考方案4】:

在一些 Microsoft 人员的帮助下(感谢 Jon Gallant 和 Josh Caplan),我了解到使用 OAuth 客户端凭据流程进行身份验证,就像我对那个 javascript 示例所做的那样,提供的访问权限不足。要使用 Power BI,身份验证需要基于特定用户。

我尝试使用:

    类似的JavaScript示例username-password-sample.js resource 值为 https://analysis.windows.net/powerbi/api谢谢,slugslog) 将usernamepassword 添加到parameters.json

这让我更接近了,但我仍然收到 400 回复:"error_description":"AADSTS90014: The request body must contain the following parameter: 'client_secret or client_assertion'. …"

adal-node 库的破解(硬编码客户端密码,即line 217 of token-request.js 之后的oauthParameters[OAuth2Parameters.CLIENT_SECRET] = "my-client-secret";)足以取回一个访问令牌,该令牌在我原来的Authorization 标头中工作,用于我原来的curl 调用.

当然,在其中硬编码该值并不是我的最终解决方案。无论如何,我不打算使用adal-node 库。但就这个身份验证案例的概念验证而言,这就是我的答案。

【讨论】:

@cgrayson 你有没有为此找到另一个解决方案?我的意思是,是否有另一个库可以提供正确的访问令牌? @VishwasShashidhar 不,我从来没有这样做过。我们最终编写了自己的方法来获取和使用访问令牌。 @cgrayson 好吧,真可惜!但是,无论如何,谢谢!看来我必须克隆 repo 并修改代码。

以上是关于无法获取客户端凭据访问令牌来授权 Power BI的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Postman 在 Django oauth 工具包客户端凭据授予中获取访问令牌

访问Power BI API时获取401 Unauthorized

Spring安全中的Oauth2客户端

Keycloak 令牌生成不起作用 - 未经授权的凭据

无法获取 lyft api 的访问令牌

OAuth2:JWT授权授予和客户端凭据授权与JWT客户端身份验证之间的区别是什么?