Power BI Embedded 来自 PHP。获取 Azure 身份验证令牌 OAuth
Power BI Embedded from PHP. Obtain an Azure Authentication token OAuth
我正在尝试利用基于 PHP 的网站的 Power BI Embedded 将非 public 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 sheet。但是,我不确定如何从 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);
}
}
我正在寻找一个简单的解决方案,如果可能的话,我可以在其中遍历每个步骤而不是臃肿的库。
您提供的 C# 代码片段可以将 Power BI 报告集成到您的网站中。
因为 Power BI 支持通过 IFrame 在您的网站上嵌入 Power BI 仪表板。
Embed the powerBi report in html iFrame.
因此,要在 PHP 网络应用程序中实现此要求,您可以尝试利用 Power BI for HTML / JavaScript。
或者直接在您的 PHP 视图脚本中创建 IFrame Dom 属性。例如
<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>
请参考http://community.powerbi.com/t5/Developer/report-embed-problem/td-p/11490/highlight/truePower BI社区跟贴的解决方法。
经过一番调查,我自己解决了这个问题。
token是JWT token,可以直接从PHP生成。
从此处包含 JWT php class: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);
然后您可以在浏览器中将其用作报告 div 的 powerbi-access-token
属性。
此外,如果它对任何人有帮助,这里是我用于 API:
的 Curl 示例
$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
授权码授予流程图:
- 在 Azure AD 中注册应用程序
- 请求授权码
- 使用授权码请求访问令牌
- 使用访问令牌访问资源
- 使用刷新令牌请求新的访问令牌
我正在尝试利用基于 PHP 的网站的 Power BI Embedded 将非 public 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 sheet。但是,我不确定如何从 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);
}
}
我正在寻找一个简单的解决方案,如果可能的话,我可以在其中遍历每个步骤而不是臃肿的库。
您提供的 C# 代码片段可以将 Power BI 报告集成到您的网站中。
因为 Power BI 支持通过 IFrame 在您的网站上嵌入 Power BI 仪表板。 Embed the powerBi report in html iFrame.
因此,要在 PHP 网络应用程序中实现此要求,您可以尝试利用 Power BI for HTML / JavaScript。
或者直接在您的 PHP 视图脚本中创建 IFrame Dom 属性。例如
<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>
请参考http://community.powerbi.com/t5/Developer/report-embed-problem/td-p/11490/highlight/truePower BI社区跟贴的解决方法。
经过一番调查,我自己解决了这个问题。
token是JWT token,可以直接从PHP生成。
从此处包含 JWT php class: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);
然后您可以在浏览器中将其用作报告 div 的 powerbi-access-token
属性。
此外,如果它对任何人有帮助,这里是我用于 API:
的 Curl 示例$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
授权码授予流程图:
- 在 Azure AD 中注册应用程序
- 请求授权码
- 使用授权码请求访问令牌
- 使用访问令牌访问资源
- 使用刷新令牌请求新的访问令牌