You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中MSAL获取的AccessToken无法渲染Power BI报表问题

问题描述

我用React JS构建Web应用,通过Microsoft MSAL JS库实现了用户认证,现在尝试用powerbi-client-react库嵌入Power BI报表。将认证后获取的AAD Access Token存入变量并传递给<PowerBIEmbed/>组件时,报表无法显示;但硬编码该Token就能正常展示,已排除权限问题。排查时出现403错误:

{message: 'LoadReportFailed', detailedMessage: 'Fail to initialize - Could not resolve cluster', errorCode: '403', level: 6, technicalDetails: {…}}

预期实现通过Token变量渲染目标报表。

相关代码片段

authConfig.js

export const pbiToken = {
    scopes: ["https://analysis.windows.net/powerbi/api/Report.Read.All"],
}

EmbedReport组件代码

import React, { useState, useEffect } from 'react';

import { PowerBIEmbed } from 'powerbi-client-react';
import { models } from 'powerbi-client';
import { pbiToken } from '../authConfig';
import { useMsal } from '@azure/msal-react';

export const EmbedReport = (props) => {
  const [powerBIAccessToken, setPowerBIAccessToken] = useState(null);
  const reportId = props.reportId;
  const embedUrl = props.embedUrl;
  const { instance, accounts } = useMsal();

  const getPowerBIToken = async () => {
    try {
      const response = await instance.acquireTokenSilent({
        scopes: pbiToken.scopes,
        account: accounts[0],
      });
      if (response.accessToken) {
        console.log("reading token", response.accessToken);
        setPowerBIAccessToken(JSON.stringify(response.accessToken));
      }
    } catch (error) {
      console.error("Error acquiring Power BI token:", error);
    }
  };

  useEffect(() => {
    const isLoggedIn = accounts.length > 0;
    if (isLoggedIn) {
      getPowerBIToken();
    }
  }, [accounts.length]);

  return (
    <>
      {powerBIAccessToken ? (
        <PowerBIEmbed
          embedConfig={{
            type: "report",
            id: reportId,
            embedUrl: embedUrl.href,
            accessToken: powerBIAccessToken,
            tokenType: models.TokenType.Aad,
            settings: {
              panes: {
                filters: {
                  expanded: false,
                  visible: false,
                },
              },
              background: models.BackgroundType.Transparent,
            },
          }}
          eventHandlers={
            new Map([
              [
                "rendered",
                function () {
                  console.log("Report rendered");
                },
              ],
              [
                "error",
                function (event) {
                  console.log(event.detail);
                },
              ],
              ["visualClicked", () => console.log("visual clicked")],
            ])
          }
          cssClassName={"reportClass"}
          getEmbeddedComponent={(embeddedReport) => {
            window.report = embeddedReport;
          }}
        />
      ) : (
        <p>'hello'</p>
      )}
    </>
  );
};

export default EmbedReport;
解决方案

问题核心在于JSON.stringify(response.accessToken)这一步:Access Token本身就是字符串类型,用JSON.stringify会给它额外包裹一层双引号,导致Power BI服务无法识别该Token,最终返回403错误。

修复步骤

  1. 移除不必要的JSON.stringify
    修改getPowerBIToken函数中的赋值逻辑,直接将原始Token赋值给状态变量:
if (response.accessToken) {
  console.log("reading token", response.accessToken);
  setPowerBIAccessToken(response.accessToken); // 去掉JSON.stringify
}
  1. 优化useEffect依赖项
    将useEffect的依赖项从accounts.length改为accounts,避免因数组长度相同但内容变化时不触发函数的问题:
useEffect(() => {
  const isLoggedIn = accounts.length > 0;
  if (isLoggedIn) {
    getPowerBIToken();
  }
}, [accounts]); // 改为监听accounts数组

内容的提问来源于stack exchange,提问作者adventureworks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:27:32