Power BI 嵌入错误 403 来自服务器的禁止错误
Power BI embed error 403 forbidden error from server
我正在按照 Power BI 社区 here 中提到的步骤进行操作,并在 Postman 中对其进行测试,并已完成前 4 个步骤。但是,在 Microsoft Power BI Embedded Playground 中测试嵌入代码时,我不断收到以下错误:
{
"message": "LoadReportFailed",
"detailedMessage": "Fail to initialize - Could not resolve cluster",
"errorCode": "403",
"level": 6,
"technicalDetails": {
"requestId": "57679585-022b-4871-ae6d-bb722d4a07cc"
}
}
此外,在尝试第 5 步中提供的替代方案 HTML 设置时,我再次收到 403 错误说明:“GET https://wabi-india-west-redirect.analysis.windows.net/powerbi/globalservice/v201606/clusterdetails 403 (Forbidden)”
请帮忙。一个多星期以来,我一直在努力让这个东西发挥作用。
请确保您在授权中发送正确的 Token header。确保使用 "Bearer " 作为授权 header.
此外,请确保您的用户拥有所有必需的权限。
事实证明,虽然我有工作区 ID、客户端 ID、报告 ID,而且我正在正确调用 API,但第五步的错误是因为我是 API 的成员我的报告所在的工作区。
为了 API 工作,您需要成为您尝试从中获取报告的工作区的管理员
我最终使用以下步骤解决了这个问题。
要在前端 (angular/ JS) 中嵌入 Power BI 报告,您必须生成 2 个不同的令牌(仅适用于应用场景)。
- 使用主帐户详细信息/服务主体帐户访问令牌
(这用于连接 power BI 服务器)
- 嵌入令牌(可以使用访问令牌和 .NET Power BI rest API 生成)。
第 1 步:访问令牌生成
PBIClientId": "xxxxxx-xxx-xxxx-xxxx-xxxxxxxxx",
"PBIClientSecret": "<client secret>",
"PBIApiUrl": "https://api.powerbi.com/",
"ResourceUrl": "https://analysis.windows.net/powerbi/api",
"AuthorityUrl": "https://login.windows.net/common/",
"TenantId": "<TenantId>",
private async Task<string> GeneratePowerBIAccessToken()
{
var tenantSpecificURL = authorityUrl.Replace("common", tenantId);
var authenticationContext = new AuthenticationContext(tenantSpecificURL);
// Authentication using app credentials
var credential = new ClientCredential(clientId, clientSecret);
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(resourceUrl, credential);
return authenticationResult.AccessToken;
}
第 2 步:获取 Power BI 报表嵌入 URL
传递在步骤 1 中生成的访问令牌、您从 power BI 门户 url 获得的 groupId 和 reportId。
private async Task<EmbedModel> GetEmbedReportModel(string groupId, string reportId, string accessToken)
{
string restUrl = "https://api.powerbi.com/v1.0/myorg/groups/" + groupId+"/reports";
// add JSON to HttpContent object and configure content type
var method = new HttpMethod("GET");
var request = new HttpRequestMessage(method, restUrl);
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
// send POST request to Power BI service
var jsonResult = await client.SendAsync(request).Result.Content.ReadAsStringAsync();
var reportObject = JsonConvert.DeserializeObject<ReportObjects>(jsonResult);
var report = reportObject.value.Where(r => r.id == reportId).FirstOrDefault();
return new EmbedModel { Id = report.id, EmbedUrl = report.embedUrl, Name = report.name };
}
}
the response you will get here is
{
"value": [
{
"datasetId": "xxxxxx-abcasdasd-dasda-4weas",
"id": "3asder78-asds-4d73-1232-5345dfsdfs",
"name": "SalesMarketing",
"webUrl": "https://app.powerbi.com/groups/xxx-xxxxx-xxx-xxxxxx-xxxxx/reports/xxxxxx-xxxx-xxx-xxxx-xxxxxxxx",
"embedUrl": "https://app.powerbi.com/reportEmbed?reportId=xxxxxx-xxxx-xxxx-xxxx-xxxxxx&groupId=aadasda21-xxcx-xx-xx-xxxxxx"
}
]
}
步骤 3:调用生成嵌入令牌 API
private async Task<EmbedToken> GenerateEmbedToken(string groupId, string reportId,string accessToken)
{
string apiURL = "https://api.powerbi.com/v1.0/myorg/groups/"+ groupId + "/reports/"+ reportId +"/GenerateToken";
string requestBody = @"{ ""accessLevel"": ""View""}";
HttpContent postRequestBody = new StringContent(requestBody);
postRequestBody.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
// prepare PATCH request
var method = new HttpMethod("POST");
var request = new HttpRequestMessage(method, apiURL);
request.Content = postRequestBody;
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
// send POST request to Power BI service
var jsonResult = await client.SendAsync(request).Result.Content.ReadAsStringAsync();
EmbedToken embedToken = JsonConvert.DeserializeObject<EmbedToken>(jsonResult);
return embedToken;
}
}
第 4 步:使用嵌入令牌并在前端应用程序中嵌入 url
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
<script src="powerbi.min.js" type="text/javascript"> </script>
<script type="text/javascript">
window.onload = function () {
var models = window['powerbi-client'].models;
var embedConfiguration = {
type: 'report',
id:'537887ee-7c7c-43c6-850b-9293f60aa3f3',
accessToken: 'H4sIAAAAAAAEAB3Tt66EV.....phVP_a_5F15fA_FCBQAA',
embedUrl: 'https://app.powerbi.com/reportEmbed?reportId=2376660ee-1c2c-16c6-980b-923260aa3f3&groupId=2adeaaa-xxxx-xxxx-xxxx-8d13b04c6e0e&w=2&config=eyJjbHVzdGVyV.....',
permissions: models.Permissions.All,
tokenType: models.TokenType.Embed,
viewMode:models.ViewMode.View,
};
var $reportContainer = $('#dashboardContainer');
var report = powerbi.embed($reportContainer.get(0), embedConfiguration);
}
</script>
<div id="dashboardContainer"></div>
</html>
Change all values before you run this.
我正在按照 Power BI 社区 here 中提到的步骤进行操作,并在 Postman 中对其进行测试,并已完成前 4 个步骤。但是,在 Microsoft Power BI Embedded Playground 中测试嵌入代码时,我不断收到以下错误:
{
"message": "LoadReportFailed",
"detailedMessage": "Fail to initialize - Could not resolve cluster",
"errorCode": "403",
"level": 6,
"technicalDetails": {
"requestId": "57679585-022b-4871-ae6d-bb722d4a07cc"
}
}
此外,在尝试第 5 步中提供的替代方案 HTML 设置时,我再次收到 403 错误说明:“GET https://wabi-india-west-redirect.analysis.windows.net/powerbi/globalservice/v201606/clusterdetails 403 (Forbidden)”
请帮忙。一个多星期以来,我一直在努力让这个东西发挥作用。
请确保您在授权中发送正确的 Token header。确保使用 "Bearer " 作为授权 header.
此外,请确保您的用户拥有所有必需的权限。
事实证明,虽然我有工作区 ID、客户端 ID、报告 ID,而且我正在正确调用 API,但第五步的错误是因为我是 API 的成员我的报告所在的工作区。
为了 API 工作,您需要成为您尝试从中获取报告的工作区的管理员
我最终使用以下步骤解决了这个问题。
要在前端 (angular/ JS) 中嵌入 Power BI 报告,您必须生成 2 个不同的令牌(仅适用于应用场景)。
- 使用主帐户详细信息/服务主体帐户访问令牌 (这用于连接 power BI 服务器)
- 嵌入令牌(可以使用访问令牌和 .NET Power BI rest API 生成)。
第 1 步:访问令牌生成
PBIClientId": "xxxxxx-xxx-xxxx-xxxx-xxxxxxxxx",
"PBIClientSecret": "<client secret>",
"PBIApiUrl": "https://api.powerbi.com/",
"ResourceUrl": "https://analysis.windows.net/powerbi/api",
"AuthorityUrl": "https://login.windows.net/common/",
"TenantId": "<TenantId>",
private async Task<string> GeneratePowerBIAccessToken()
{
var tenantSpecificURL = authorityUrl.Replace("common", tenantId);
var authenticationContext = new AuthenticationContext(tenantSpecificURL);
// Authentication using app credentials
var credential = new ClientCredential(clientId, clientSecret);
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(resourceUrl, credential);
return authenticationResult.AccessToken;
}
第 2 步:获取 Power BI 报表嵌入 URL
传递在步骤 1 中生成的访问令牌、您从 power BI 门户 url 获得的 groupId 和 reportId。
private async Task<EmbedModel> GetEmbedReportModel(string groupId, string reportId, string accessToken)
{
string restUrl = "https://api.powerbi.com/v1.0/myorg/groups/" + groupId+"/reports";
// add JSON to HttpContent object and configure content type
var method = new HttpMethod("GET");
var request = new HttpRequestMessage(method, restUrl);
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
// send POST request to Power BI service
var jsonResult = await client.SendAsync(request).Result.Content.ReadAsStringAsync();
var reportObject = JsonConvert.DeserializeObject<ReportObjects>(jsonResult);
var report = reportObject.value.Where(r => r.id == reportId).FirstOrDefault();
return new EmbedModel { Id = report.id, EmbedUrl = report.embedUrl, Name = report.name };
}
}
the response you will get here is
{
"value": [
{
"datasetId": "xxxxxx-abcasdasd-dasda-4weas",
"id": "3asder78-asds-4d73-1232-5345dfsdfs",
"name": "SalesMarketing",
"webUrl": "https://app.powerbi.com/groups/xxx-xxxxx-xxx-xxxxxx-xxxxx/reports/xxxxxx-xxxx-xxx-xxxx-xxxxxxxx",
"embedUrl": "https://app.powerbi.com/reportEmbed?reportId=xxxxxx-xxxx-xxxx-xxxx-xxxxxx&groupId=aadasda21-xxcx-xx-xx-xxxxxx"
}
]
}
步骤 3:调用生成嵌入令牌 API
private async Task<EmbedToken> GenerateEmbedToken(string groupId, string reportId,string accessToken)
{
string apiURL = "https://api.powerbi.com/v1.0/myorg/groups/"+ groupId + "/reports/"+ reportId +"/GenerateToken";
string requestBody = @"{ ""accessLevel"": ""View""}";
HttpContent postRequestBody = new StringContent(requestBody);
postRequestBody.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
// prepare PATCH request
var method = new HttpMethod("POST");
var request = new HttpRequestMessage(method, apiURL);
request.Content = postRequestBody;
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
// send POST request to Power BI service
var jsonResult = await client.SendAsync(request).Result.Content.ReadAsStringAsync();
EmbedToken embedToken = JsonConvert.DeserializeObject<EmbedToken>(jsonResult);
return embedToken;
}
}
第 4 步:使用嵌入令牌并在前端应用程序中嵌入 url
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
<script src="powerbi.min.js" type="text/javascript"> </script>
<script type="text/javascript">
window.onload = function () {
var models = window['powerbi-client'].models;
var embedConfiguration = {
type: 'report',
id:'537887ee-7c7c-43c6-850b-9293f60aa3f3',
accessToken: 'H4sIAAAAAAAEAB3Tt66EV.....phVP_a_5F15fA_FCBQAA',
embedUrl: 'https://app.powerbi.com/reportEmbed?reportId=2376660ee-1c2c-16c6-980b-923260aa3f3&groupId=2adeaaa-xxxx-xxxx-xxxx-8d13b04c6e0e&w=2&config=eyJjbHVzdGVyV.....',
permissions: models.Permissions.All,
tokenType: models.TokenType.Embed,
viewMode:models.ViewMode.View,
};
var $reportContainer = $('#dashboardContainer');
var report = powerbi.embed($reportContainer.get(0), embedConfiguration);
}
</script>
<div id="dashboardContainer"></div>
</html>
Change all values before you run this.