PowerBI 无法在 parsePowerBIAccessToken 中的 'Window' 上执行 'atob'

PowerBI Failed to execute 'atob' on 'Window' in parsePowerBIAccessToken

今天随机我的 powerbi 嵌入式代码一直在抛出:

DOMException: Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
at window.atob (eval at <anonymous> (https://app.powerbi.com/13.0.11674.244/scripts/reportembed.externals.bundle.min.js:1326:504), <anonymous>:1:83)
at e.parsePowerBIAccessToken (https://app.powerbi.com/13.0.11674.244/scripts/reportEmbed.min.js:1:2331307)
at e.isTokenTenantValid (https://app.powerbi.com/13.0.11674.244/scripts/reportEmbed.min.js:1:2331046)
at t.isPowerBIAccessTokenValid (https://app.powerbi.com/13.0.11674.244/scripts/reportembed.bundle.min.js:21:31523)
at t.promptForLogin (https://app.powerbi.com/13.0.11674.244/scripts/reportembed.bundle.min.js:21:31233)
at m.scope.promptForLogin (https://app.powerbi.com/13.0.11674.244/scripts/reportembed.bundle.min.js:21:25515)
at fn (eval at compile (https://app.powerbi.com/13.0.11674.244/scripts/reportembed.externals.bundle.min.js:1444:307), <anonymous>:4:374)
at m.$digest (https://app.powerbi.com/13.0.11674.244/scripts/reportembed.externals.bundle.min.js:1350:310)
at https://app.powerbi.com/13.0.11674.244/scripts/reportEmbed.min.js:1:1626830
at t.i [as _next] (https://app.powerbi.com/13.0.11674.244/scripts/reportEmbed.min.js:1:189984)

我检查了访问令牌,它们似乎有效。 (与昨天工作的人没有什么不同)。我在 window.atob 中添加了一个调试挂钩,似乎 parsePowerBIAccessToken 内部的某些东西正在将未定义的传递给 atob。除非更改此代码,否则我无法弄清楚为什么。

有点卡在如何找出问题上。 (没有帮助 Chrome 似乎很难在不崩溃的情况下调试这些行)。

代码路径试图通过此代码运行嵌入令牌:

e.prototype.parsePowerBIAccessToken = function() {
    return JSON.parse(atob(i.powerBIAccessToken.split(".")[1]))
}

奇怪,因为代码显然使用了 "tokenType: models.TokenType.Embed,",因此可能不应该沿用该代码路径?

我注意到如果我登录到 MS 帐户,它就可以工作,所以它使用了 cookie。

如果您从报告中复制并粘贴嵌入 URL,它将在 URL 中包含 autoAuth=true。您必须从嵌入 URL 中删除它,否则它会尝试使用您的 cookie 进行身份验证。 (它还会尝试像访问令牌一样使用嵌入令牌并执行错误的代码,所以这是 MS 的错误)。

在我的 JS 代码中,我从嵌入中删除了 autoAuth url,它将跳过尝试使用 cookie。

embedURL = embedURL.replace(/autoAuth=true&/ig, '');

您应该始终使用 REST API 获取嵌入 URL。

来自embed for your customers (Embed Token) documentation

using Microsoft.PowerBI.Api.V2;
using Microsoft.PowerBI.Api.V2.Models;

// You need to provide the workspaceId where the dashboard resides.
ODataResponseListReport reports = await client.Reports.GetReportsInGroupAsync(workspaceId);

// Get the first report in the group.
Report report = reports.Value.FirstOrDefault();

// Generate Embed Token.
var generateTokenRequestParameters = new GenerateTokenRequest(accessLevel: "view");
EmbedToken tokenResponse = client.Reports.GenerateTokenInGroup(workspaceId, report.Id, generateTokenRequestParameters);

// Generate Embed Configuration.
var embedConfig = new EmbedConfig()
{
    EmbedToken = tokenResponse,
    EmbedUrl = report.EmbedUrl,
    Id = report.Id
};

您从报告对象中获得嵌入 URL。

你从powerbi.com得到的URL是powerbi secure embed,不建议将这个URL用于其他场景

我们向 PowerBI 团队提出了这个问题。您应该使用 API 调用来获取报告的嵌入 URL。这里有一个 API 测试人员:https://docs.microsoft.com/en-us/rest/api/power-bi/reports/getreportingroup

这里是测试嵌入的 playground:https://microsoft.github.io/PowerBI-JavaScript/demo/v2-demo/index.html