2015-09-01 83 views
12

我试图使用Power Client REST API,使用通过“客户端凭据”方法获取的访问令牌,但我一直在根据我的请求获取403 Forbidden无法获取客户端凭据访问令牌来授权Power BI

我的代码遵循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请求访问令牌,如下,我通过浏览器网络工具

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请求不知何故有缺陷的,我snooped out an access token “the wrong way”,和上述工作正常,返回200和JSON响应列举我的数据集:获得403

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

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

+0

给我你的代码,我会为你调试它http://bit.ly/emailjon。我在强大的团队。 –

+2

这太可笑了。使用我见过的REST API是最麻烦的。通常情况下,点击几次即可获得密钥或令牌,几分钟内即可通过邮递员获得结果。为什么PBI团队不能建立一个简单的网页来自动启用api并根据真实账户凭证生成样本调用,就像其他许多人一样? – Lee

回答

5

随着微软的一些人的帮助(感谢,乔恩浩&乔希·卡普兰),我已经学会了与OAuth的客户证书认证流程,因为我是用做该JavaScript示例提供的访问权限不足。要使用Power BI,认证需要基于特定的用户。

我尝试使用:

  1. 类似的JavaScript样品username-password-sample.js
  2. https://analysis.windows.net/powerbi/apiresource值(感谢,slugslog
  3. 添加usernamepasswordparameters.json

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

一劈到adal-node库(硬编码的客户端密钥,即oauthParameters[OAuth2Parameters.CLIENT_SECRET] = "my-client-secret";line 217 of token-request.js后),都足以让后面的访问令牌这在Authorization头对我的原curl调用工作。

当然,硬编码的价值并不是我最终的解决方案。无论如何,我不打算使用adal-node库。但就这个认证案例的这个概念验证而言,这就是我所要达到的答案。

+0

谢谢分享! –

+0

@cgrayson您是否曾经为此获得过另一个解决方案?我的意思是,是否有另一个库提供正确的访问令牌? –

+0

@VishwasShashidhar不,我从来没有。我们结束编码我们自己的方法来获取和使用访问令牌。 – cgrayson

2

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

+0

在Azure Active Directory中,在“应用程序”的“配置”选项卡上的“对其他应用程序的权限”下,有“Power BI Service”。它显示“应用程序权限:0”(箭头不会弹出任何更改)和“委托权限:7”(该下拉菜单显示所有选中的框,包括“读取和写入所有数据集(预览)”)。这就是上述测试之前已经设定的内容;我还没有改变任何东西。我在正确的地方看吗? – cgrayson

+0

我已经破解了上面例子中的令牌。我没有看到它的权限。首先要检查的是您使用的应用程序ID与您在AAD中检查的应用程序ID相同。如果是这样,这是一个Web应用程序或本地应用程序? –

+0

嗯,我不确定什么“应用程序ID”是?我在哪里可以在Azure中找到并/或将其设置在客户端?我确实在'clientId'上匹配了我的查询,这是一样的。这是一个网络应用程序。至少,它试图成为。 :-) – cgrayson

2

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

http://blogs.msdn.com/b/richard_dizeregas_blog/archive/2015/02/24/building-apps-with-the-new-power-bi-apis.aspx&ei=HzQDaQP3&lc=en-IN&geid=7&s=1&m=620&ts=1443608339&sig=APONPFlUC04ktQuEYWqI_VKfMqvxascf0A

+0

当我尝试以任何方式访问https://analysis.windows.net/时,我得到“服务器未找到”。也不清楚你建议使用URL的位置。作为“权威主机URL”(如[这里](https://github.com/AzureAD/azure-activedirectory-library-for-nodejs/blob/master/sample/client-credentials-sample.js#L50)?或作为实际BI请求的目标(如我最初的'curl'示例)? – cgrayson

+0

应该是您请求令牌的“resource”属性的值。下面是我正在使用的一个nodejs示例。这是你正在使用的值“00000009-0000-0000-c000-000000000000”的地方。 – slugslog

2

所以,我想这与我自己的应用程序,以下命令作品(对我来说):

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

BTW,额外的 “V” 之后-v似乎是多余的。

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

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

+0

是的,你说得对我的'-vv'。沿线的某处我认为curl是那些用更多'v's增加冗长度的命令,但是[nope](http://stackoverflow.com/questions/24402473/what-is-meaning-of-vvv-option-in-curl-request)。 – cgrayson

相关问题