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

MSAL中acquireTokenSilent始终生成新Access Token的问题求助

MSAL中acquireTokenSilent始终生成新Access Token的问题求助

大家好,我最近在做MSAL.js集成的时候碰到了个头疼的问题:每次刷新页面,acquireTokenSilent都会重新生成一个新的access token,完全没有复用MSAL的缓存。我本来想把token存在localStorage里供fetch工具调用,但现在每次刷新都拿新token,后端那边每次请求的token都不一样,这显然不符合预期。

下面是我的相关代码,麻烦各位帮忙看看哪里出问题了:

route.tsx 文件

export const msalInstance = new PublicClientApplication(msalConfig);
const accounts = msalInstance.getAllAccounts();
if (accounts.length > 0) {
  msalInstance.setActiveAccount(accounts[0]);
}

msalInstance.addEventCallback((event: EventMessage) => {
  if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) {
    const payload = event.payload as AuthenticationResult;
    const account = payload.account;
    msalInstance.setActiveAccount(account);
  }
});

export const router = createBrowserRouter([
  {
    path: '/',
    element: <App pca={msalInstance} />,
    children: [
      { path: '/', element: <Home /> },
    ],
  },
]);

App.tsx 文件

function App({ pca }: AppProps) {
  const authRequest = {
    ...loginRequest,
  };

  return (
    <MsalProvider instance={pca}>
      <MsalAuthenticationTemplate
        interactionType={InteractionType.Redirect}
        authenticationRequest={authRequest}
        errorComponent={Error}
        loadingComponent={Loading}
      >
        <OutletWrapper />
      </MsalAuthenticationTemplate>
    </MsalProvider>
  );
}

const OutletWrapper: React.FC = () => {
  const { instance } = useMsal();
  const account = useAccount(accounts[0] || {});
  const [apiData, setApiData] = useState<AuthenticationResult | null>(null);

  useEffect(() => {
    if (account) {
      instance
        .acquireTokenSilent({
          scopes: ['User.Read'],
          account: account,
        })
        .then((response) => {
          if (response) {
            localStorage.setItem('authStatus', response.idToken);
            setApiData(response);
          }
        });
    }
  }, [account, instance]);

  if (!apiData) return <Loading />;

  return (
    <CompanySelectionWrapper>
      <Sidebar />
      <Outlet />
    </CompanySelectionWrapper>
  );
};

export default App;

fetch.js 文件

export default async function fetchUrl(url: string, options: optionsProps) {
  let jwtToken = localStorage.getItem('authStatus');
  authAddedOptions.headers = {
    ...authAddedOptions.headers,
    Authorization: `Bearer ${jwtToken}`,
  };
  return fetch(url, authAddedOptions).then(handleHTTPErrors);
}

我怀疑是不是在获取account或者调用acquireTokenSilent的方式上有问题?或者MSAL实例的初始化哪里没配置对,导致它没法正确读取缓存的token?麻烦各位大佬帮忙排查一下,谢谢了!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:30:29