2015-09-01 85 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

相關問題