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

Azure获取Access Token时遇uninitialized_public_client_application错误求助

解决MSAL uninitialized_public_client_application 错误

你遇到的错误是因为创建PublicClientApplication实例后,还没完成初始化就将其传递给MsalProvider,Msal内部会在实例未就绪时尝试调用相关API,从而触发这个报错。

修复方案

核心思路是在App组件中完成MSAL实例的初始化后,再渲染MsalProvider,具体修改如下:

修改App.jsx

import { useState, useEffect } from 'react';
import { PublicClientApplication, MsalProvider } from '@azure/msal-react';
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
import { AppRoot } from './AppRoot';
import { Prompt } from './Prompt';

function App() {
  const [pca, setPca] = useState(null);
  const [isReady, setIsReady] = useState(false);

  const msalConfig = {
    auth: {
      clientId: '*******',
      authority: 'https://login.microsoftonline.com/***********'
    },
    cache: {
      cacheLocation: 'localStorage',
      storeAuthStateInCookie: true
    }
  };

  useEffect(() => {
    async function initMsalInstance() {
      const instance = new PublicClientApplication(msalConfig);
      await instance.initialize();
      setPca(instance);
      setIsReady(true);
    }
    initMsalInstance();
  }, []);

  // 初始化完成前显示加载提示
  if (!isReady) {
    return <div>加载中...</div>;
  }

  return (
    <div className="App">
      <MsalProvider instance={pca}>
        <BrowserRouter>
          <Routes>
            <Route element={<AppRoot />}>
              <Route path="/" element={<Prompt />} />
              <Route path="*" element={<Navigate to="/" />} />
            </Route>
          </Routes>
        </BrowserRouter>
      </MsalProvider>
    </div>
  );
}

export default App;

修改Prompt.jsx

移除多余的instance.initialize()调用,因为实例已经在App组件中完成初始化:

import { useEffect } from 'react';
import { useMsal } from '@azure/msal-react';

export const Prompt = () => {
  const { instance } = useMsal();

  useEffect(() => {
    login();
  }, []);

  const login = async () => {
    try {
      const response = await instance.loginPopup({
        scopes: ["api:********"]
      });
      console.log(response);
    } catch (err) {
      console.log(err);
    }
  };

  return (
    <div>Prompt</div>
  );
};

为什么这样能解决问题?

MSAL v2及以上版本要求PublicClientApplication实例必须先通过initialize()完成初始化,才能被MsalProvider或其他登录/获取令牌的API使用。原代码中,实例刚创建就传给了MsalProvider,Provider内部会立即尝试访问实例的状态,这时候实例还没初始化完成,就会抛出uninitialized_public_client_application错误。

将初始化逻辑放在App组件的useEffect中,确保实例完全就绪后再渲染Provider,就能避免这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:00:15