Using Python with Power Bi embedded was a true pain. The SDK app was outdated and unsupported, so I was forced to read go through hundreds of blog posts to develop a pure get/post solution. Here is a walkthrough that can be used by any language, and in my opinion is quite easier than any of the native solutions.
Step 1: Authorize App
I used a native app, it was the simplest solution. You can use a server-web app, but you will need to add client_secret anywhere you see client_id in this walkthrough. You will need to at least have read permissions enabled.
Step 2: Get Access Token (post)
POST: https://login.microsoftonline.com/common/oauth2/token Body: { grant_type: password scope: openid resource: https://analysis.windows.net/powerbi/api client_id: {Client ID} username: {PBI Account Username} password: {PBI Account Username} } --Returns Json: { "token_type": "Bearer", "scope": "Report.Read.All ...", "expires_in": "xxxx", "ext_expires_in": "0", "expires_on": "xxxxxxxxxx", "not_before": "xxxxxxxxxxx", "resource": "https://analysis.windows.net/powerbi/api", "access_token": "eyJ0eXAi...", "refresh_token": "AQABA...", "id_token": "eyJ...." }
Step 3: Get Report details:
This can be done two different ways. The simplest way is to navigate to your report on the Power Bi website and pull the report id and group id from the url.
https://app.powerbi.com/groups/{GROUP ID}/reports/{REPORT ID}/ReportSection
I needed to pull different reports from a given group, so here is the get request to do that.
GET https://api.powerbi.com/v1.0/myorg/groups/{GROUP ID}/reports headers = { Authorization: Bearer + {access_token from first post} } Returns Json: { "@odata.context": "http://wabi-west-us-redirect.analysis.windows.net/v1.0/myorg/groups/fca336fb-40bc-4bce-b2ed-a4da7a44b12f/$metadata#reports", "value": [ { "id": "...", "modelId": 0, "name": "...", "webUrl": "...", "embedUrl": "https://app.powerbi.com/reportEmbed?reportId={REPORT ID}&groupId={GROUP ID}", "isOwnedByMe": true, "isOriginalPbixReport": false, "datasetId": "..." }, ... Repeated for other Reports in Group }
Step 4: Get Embed token
In the old Power Bi server (through Azure) you could encode your own embed token, in the September 2017 update Microsoft started to require that you use the rest api or one of the available SDKs. In the "data" section you can pass user roles along with other filters
POST https://api.powerbi.com/v1.0/myorg/groups/{GROUP ID}/reports/{REPORT ID}/GenerateToken headers = { Authorization: Bearer + {access_token from first post} Content-Type:application/json; charset=utf-8 Accept:application/json } data= { "accessLevel": "View", "allowSaveAs": "false" } Returns Json: { "@odata.context": "http://wabi-west-us-redirect.analysis.windows.net/v1.0/myorg/groups/{GROUP_ID}/$metadata#Microsoft.PowerBI.ServiceContracts.Api.V1.GenerateTokenResponse", "token": "H4sIAAAAAAA...", "tokenId": "...", "expiration": "yyyy-mm-ddTxx:xxxxx" }
Step 5: Test
Go to the Microsoft Power BI Embedded Sample site (link) and test your report.
The input fields are as follows:
- Embed Token: {token from final post}
- Embed URL: https://app.powerbi.com/reportEmbed?reportId={REPORT ID}&groupId={GROUP ID}
- Report Id: {REPORT ID}
You can also test the embedded report using the following :
<html><script src="https://microsoft.github.io/PowerBI-JavaScript/demo/node_modules/jquery/dist/jquery.js"></script><script src="https://microsoft.github.io/PowerBI-JavaScript/demo/node_modules/powerbi-client/dist/powerbi.js"></script><script type="text/javascript"> window.onload = function () { var embedConfiguration = { type: 'report', accessToken: '{access_token}', embedUrl: 'https://app.powerbi.com/reportEmbed?reportId={REPORT ID}&groupId={GROUP ID}', id:'{REPORT ID}', settings: { {settings_ from link} } }; var $reportContainer = $('#dashboardContainer'); var report = powerbi.embed($reportContainer.get(0), embedConfiguration); } function reloadreport(){ var element = $('#dashboardContainer'); alert(element); var report = powerbi.get(element); report.reload().catch(error => {console.log(error) }); };</script> <div id="dashboardContainer"></div></html>
Notes:
Available settings can be found here.
Disclaimer:
This code comes with no warranty and no guarantees. It is HIGHLY likely that Microsoft will change something and this walkthrough will become depreciated. Please check your PowerBi agreement to make sure that the steps listed in this walkthrough adhere to the agreed upon terms.
Tags:
Python, embedded, token, access token, get, post, REST API, ruby, PHP
EDIT 1:
Microsoft though emojis were appropriate in code sections... added space to prevent and