Я пытаюсь использовать Power BI Embedded с веб-сайта на основе PHP для встраивания непубличного документа Power BI на веб-страницу (за логином пользователя).
Здесь есть версия C #, которую я запустил: https://github.com/Azure-Samples/power-bi-embedded-integrate-report-into-web-app/. Мне фактически нужно повторить это в PHP).
(также см https://azure.microsoft.com/en-us/documentation/articles/power-bi-embedded-get-started/)
Я застрял, пытаясь получить аутентификационный токен.
Сайт C # генерирует токен авторизации, который, если я вставлю его в свой сайт PHP, я могу использовать для загрузки листа Power BI. Тем не менее, я не уверен, как сгенерировать это из PHP — предположительно, где-нибудь запрос curl, но я не могу понять, что мне нужно отправить куда? [Правка: я перехватывал пакеты, и он, похоже, не отправляет http-запрос на генерацию, поэтому, возможно, мне просто нужно знать, как его сгенерировать сам?]. C # использует встроенную библиотеку (PowerBIToken) для этого.
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);
}
}
Я ищу простое решение, где я могу пройти каждый шаг, а не раздутую библиотеку, если это возможно.
После некоторого расследования я решил это сам.
Токен является токеном JWT, который может быть сгенерирован непосредственно из PHP.
Включите класс php JWT отсюда: https://github.com/firebase/php-jwt
Для аутентификации при вызовах API используйте:
$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);
А для аутентификации для отображения отчета в браузере используйте:
$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);
Затем вы можете использовать это как powerbi-access-token
атрибут вашего отчета div в браузере.
Кроме того, на случай, если это кому-нибудь поможет, вот пример Curl, который я использую для 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);
Эта страница документа помогла мне получить токены и встроить коды с помощью php / js — она описывает каждый запрос и ответ шаг за шагом:
https://msdn.microsoft.com/en-us/library/azure/dn645542.aspx
Блок-схема кода авторизации:
Фрагмент кода C #, который вы предоставляете, для интеграции отчетов Power BI на ваш веб-сайт.
Как Power BI Поддерживает встраивание панели инструментов Power BI на ваш сайт через IFrame.
Вставить отчет PowerBi в HTML-формате iFrame.
Таким образом, чтобы реализовать это требование в PHP веб-приложении, вы можете попробовать использовать Power BI для HTML / JavaScript.
Или создайте IFrame Dom непосредственно в своем скрипте PHP. НАПРИМЕР.
<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>
Пожалуйста, обратитесь к решению потока на Power BI сообщества по адресу http://community.powerbi.com/t5/Developer/report-embed-problem/td-p/11490/highlight/true.