Power BI API 在我的工作区中获取仪表板时返回 403 禁止

Power BI API returning 403 forbidden when fetching dashboard in My workspace

我会尝试 Power BI API。

所以我首先获取 Embed Token(我使用的是应用程序拥有数据的场景)。

1.access令牌

var options = {
    'method': 'POST',
    'url': `https://login.microsoftonline.com/${process.env.TENANT_ID}/oauth2/token`,
    'headers': {
        'Content-Type': 'multipart/form-data'
    },
    formData: {
        'grant_type': process.env.GRANT_TYPE,
        'client_id': process.env.CLIENT_ID,
        'client_secret': process.env.CLIENT_SECRET,
        'resource': process.env.RESSOURCE,
        'Scope': process.env.SCOPE
    }
};

// get Access token from AAD to retrieve Embed Token in PBI API
let response;
try {
    response = await new Promise((resolve, reject) => {
        request(options, (error, response, data) => {
            if (error) reject(error)
            else resolve(data)
        })
    })
}
catch (error) {
    context.error(error)
}

2.Fetch 嵌入令牌 (Docs)

var data = '{accessLevel:"View"}';

var config = {
    method: 'post',
    url: `https://api.powerbi.com/v1.0/myorg/groups/${process.env.GROUP_ID}/dashboards/${process.env.DASHBOARD_ID}/GenerateToken`,
    headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${JSON.parse(response).access_token}`
    },
    data: data
};

const embedtoken = await axios(config)

context.res = {
    // status: 200, /* Defaults to 200 */
    body: embedtoken.data
};

3。我已在 azure

上授予权限

我正在获取一个嵌入令牌。

4.获取仪表板信息

我正在使用邮递员从我在 api 中提到的同一组 ID 和仪表板 ID 中获取仪表板信息,以获取嵌入令牌

(我在授权部分添加了那个令牌)

问题是我收到 403 Forbidden 错误。

PS:在中提到了服务主体方法的一些限制。这是我问题的根源吗?我必须使用 master user 方法吗?

您对Embed Token的使用存在误解。它不能用于直接调用 https://api.powerbi.com/v1.0/myorg/groups/{group id}/dashboards/{dashboard id}/。这里需要 AAD 令牌。

要使用嵌入令牌,您应该用它调用嵌入 URL。

Embed URL 的格式如下:

https://app.powerbi.com/reportEmbed?reportId=f6bfd646-b718-44dc-a378-b73e6b528204&groupId=be8908da-da25-452e-b220-163f52476cdd&config=eyJjbHVzdGVyVXJsIjoiaHR0cHM6Ly9XQUJJLVVTLU5PUlRILUNFTlRSQUwtcmVkaXJlY3QuYW5hbHlzaXMud2luZG93cy5uZXQiLCJlbWJlZEZlYXR1cmVzIjp7Im1vZGVybkVtYmVkIjp0cnVlfX0%3d

.net 示例:

// 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
};

然后你可以用EmbedToken调用EmbedUrl

引用here.