无法获取客户端凭据访问令牌来授权 Power BI
Can't get client-credentials access token to authorize Power BI
我正在尝试使用 Power BI REST API,使用通过 "client credentials" 方法获取的访问令牌,但我的请求一直收到 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,上面的工作正常,returning 200
和 JSON 响应列出我的数据集。
我也注意到return代码是403
(禁止),而不是401
(未授权),所以我想知道授权是否可以但是权限Power BI 方面是错误的。但是当我使用任何垃圾文本作为访问令牌(例如,Authorization: Bearer foo
)时,我也会得到 403
,所以我放弃了那个理论。
所以。我想我有一个有效的测试,我得到了我认为是有效的访问令牌(来自 client-credentials-sample.js
代码),但它仍然无法正常工作。我错过了什么?
确保您注册到 AAD 的应用程序具有读写所有数据集的权限。那应该可以解决问题。
这不是答案,而是调试过程中向前迈出的一步。我认为请求令牌的资源应该是“https://analysis.windows.net/powerbi/api”。我在多个参考文献中看到过这些;其中之一链接如下。即使在更改之后,我仍然得到 403。正如 OP 提到的,如果我们使用 powerBI 门户中的 accessToken,一切正常。
所以我用我自己的应用程序尝试了这个,以下命令有效(对我来说):
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
在一些 Microsoft 人员的帮助下(感谢 Jon Gallant 和 Josh Caplan),我了解到使用 OAuth client-credentials 流程进行身份验证,因为我正在处理 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";
)足以取回在 [=19] 中工作的访问令牌=] header 我原来的 curl
电话。
当然,硬编码其中的值并不是我的最终解决方案。无论如何,我不打算使用 adal-node
库。但就这个 proof-of-concept 对于这个身份验证案例而言,这就是我得出的答案。
我正在尝试使用 Power BI REST API,使用通过 "client credentials" 方法获取的访问令牌,但我的请求一直收到 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
请求是否存在某种缺陷,我 200
和 JSON 响应列出我的数据集。
我也注意到return代码是403
(禁止),而不是401
(未授权),所以我想知道授权是否可以但是权限Power BI 方面是错误的。但是当我使用任何垃圾文本作为访问令牌(例如,Authorization: Bearer foo
)时,我也会得到 403
,所以我放弃了那个理论。
所以。我想我有一个有效的测试,我得到了我认为是有效的访问令牌(来自 client-credentials-sample.js
代码),但它仍然无法正常工作。我错过了什么?
确保您注册到 AAD 的应用程序具有读写所有数据集的权限。那应该可以解决问题。
这不是答案,而是调试过程中向前迈出的一步。我认为请求令牌的资源应该是“https://analysis.windows.net/powerbi/api”。我在多个参考文献中看到过这些;其中之一链接如下。即使在更改之后,我仍然得到 403。正如 OP 提到的,如果我们使用 powerBI 门户中的 accessToken,一切正常。
所以我用我自己的应用程序尝试了这个,以下命令有效(对我来说):
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
在一些 Microsoft 人员的帮助下(感谢 Jon Gallant 和 Josh Caplan),我了解到使用 OAuth client-credentials 流程进行身份验证,因为我正在处理 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";
)足以取回在 [=19] 中工作的访问令牌=] header 我原来的 curl
电话。
当然,硬编码其中的值并不是我的最终解决方案。无论如何,我不打算使用 adal-node
库。但就这个 proof-of-concept 对于这个身份验证案例而言,这就是我得出的答案。