简体   繁体   中英

Power BI Embedded from PHP. Obtain an Azure Authentication token OAuth

I'm trying to utilise Power BI Embedded from a PHP based website to embed a non-public Power BI document into a web page (behind a user login).

There is a C# version here that I have got running: https://github.com/Azure-Samples/power-bi-embedded-integrate-report-into-web-app/ . I effectively need to replicate this in PHP).

(also see https://azure.microsoft.com/en-us/documentation/articles/power-bi-embedded-get-started/ )

I'm stuck trying to obtain a auth-token.

The C# site generates an auth-token that if I paste into my PHP site, I can use to load the Power BI sheet. However, I'm not sure how to generate this from PHP - presumably a curl request somewhere, but I can't work out what I need to send where? [Edit: I've been sniffing packets and it doesn't seem to make an http request to generate this, so perhaps I just need to know how to generate it myself?]. The C# is using a built in library (PowerBIToken) to do this.

public async Task<ActionResult> Report(string reportId)
    {


        var devToken = PowerBIToken.CreateDevToken(this.workspaceCollection, this.workspaceId);
        using (var client = this.CreatePowerBIClient(devToken))
        {
            var reportsResponse = await client.Reports.GetReportsAsync(this.workspaceCollection, this.workspaceId);
            var report = reportsResponse.Value.FirstOrDefault(r => r.Id == reportId);
            var embedToken = PowerBIToken.CreateReportEmbedToken(this.workspaceCollection, this.workspaceId, report.Id);

            var viewModel = new ReportViewModel
            {
                Report = report,
                AccessToken = embedToken.Generate(this.accessKey)
            };

            return View(viewModel);
        }
    }

I'm looking for a simple solution where I can walk through each step rather than a bloated library if possible.

After some investigation I worked this one out myself.

The token is a JWT token, which can be generated directly from PHP.

Include the JWT php class from here: https://github.com/firebase/php-jwt

To authenticate for calls to the API use:

$key = "<your Azure access key>";
$payload = array(
    "ver" => "0.1.0",
    "type" => "dev",
    "wcn" => "<your workspace collection name>",
    "wid" => "<your workspace ID>",
    "iss" => "PowerBISDK",
    "aud" => "https://analysis.windows.net/powerbi/api",
    "exp" => time()+60*60,
    "nbf" => time()
);
$token = JWT::encode($payload,$key);

And to authenticate for displaying a report in the browser use:

$key = "<your Azure access key>";
$payload = array(
    "ver" => "0.1.0",
    "type" => "embed",
    "wcn" => "<your workspace collection name>",
    "wid" => "<your workspace ID>",
    "rid" => "<your reportID (as uploaded to your collection)>",
    "iss" => "PowerBISDK",
    "aud" => "https://analysis.windows.net/powerbi/api",
    "exp" => time()+60*60,
    "nbf" => time()
);
$token = JWT::encode($payload,$key);

You can then use this as the powerbi-access-token attribute on your report div in the browser.

Also, in case it helps anyone, here's an example of the Curl I use for the API:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.powerbi.com/beta/collections/<your workspace collection name>/workspaces/<your workspace ID>/reports");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //Might be required for https
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Authorization: AppToken " . $token
));
$response_json = curl_exec($ch);
curl_close($ch);

$response_data = json_decode($response,true);

This doc page helped me getting token and embed codes by php/js - it describes every request and response step by step:

https://msdn.microsoft.com/en-us/library/azure/dn645542.aspx

Authorization Code Grant Flow Diagram:

  • Register the Application in Azure AD
  • Request an authorization code
  • Use the Authorization Code to Request an Access Token
  • Use the Access Token to Access the Resource
  • Use the Refresh Token to Request a New Access Token

The C# code snippet you provide seams to integrate Power BI reports into your web site.

As Power BI Supports for embed power BI dashboard on your website via IFrame. Embed the powerBi report in html iFrame .

So to implement this requirement in PHP web app, you can try to leverage Power BI for HTML / JavaScript .

Or directly create IFrame Dom attributed in your PHP view script. EG

<html lang="en">
<head>
    <script type="text/javascript">
        // post the auth token to the iFrame.
        function postActionLoadReport() {

            // get the access token.
            accessToken = '<?php echo $accessToken;?>';

            // return if no a
            if ("" === accessToken)
                return;

            // construct the push message structure
            // this structure also supports setting the reportId, groupId, height, and width.
            // when using a report in a group, you must provide the groupId on the iFrame SRC
            var m = { action: "loadReport", accessToken: accessToken};
            message = JSON.stringify(m);

            // push the message.
            iframe = document.getElementById('iFrameEmbedReport');
            iframe.contentWindow.postMessage(message, "*");;
        }
     </script>
</head>
<body>
    <div>
        <p><b>Embedded Report</b></p>
        <table> <tr>
                    <td>
                        <iframe id="iFrameEmbedReport" src="<?php echo $reportURI;?>" onload="postActionLoadReport()" height="768px" width="1024px" frameborder="1" seamless></iframe>
                    </td>
                </tr>
        </table>
    </div>
</body>

Please refer to the solution of the thread on Power BI community at http://community.powerbi.com/t5/Developer/report-embed-problem/td-p/11490/highlight/true .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM