无法获取客户端凭据访问令牌来授权 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
是那些增加更多v
s 的命令之一,但nope。【参考方案4】:
在一些 Microsoft 人员的帮助下(感谢 Jon Gallant 和 Josh Caplan),我了解到使用 OAuth 客户端凭据流程进行身份验证,就像我对那个 javascript 示例所做的那样,提供的访问权限不足。要使用 Power BI,身份验证需要基于特定用户。
我尝试使用:
-
类似的JavaScript示例username-password-sample.js
resource
值为 https://analysis.windows.net/powerbi/api
(谢谢,slugslog)
将username
和password
添加到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 工具包客户端凭据授予中获取访问令牌