Jamie G Jamie G - 7 months ago 37
PHP Question

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.

Answer

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

Then generate your token with the following:

$key = "<your Azure access key>";
$payload = array(
    "ver" => "0.1.0",
    "type" => "embed",
    "wcn" => "<your workspace collection name>",
    "wid" => "<your workspace collection 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.

Comments