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

调用Microsoft Graph API拉取Azure用户时出现AcquireToken_In_Progress报错及登录弹窗

AcquireToken_In_Progress 报错的本质是MSAL同一时间仅允许处理一个登录/令牌获取请求,你当前的场景触发了重复的登录流程,才会弹出多次登录窗口同时报错。

排查解决步骤

1. 确保MSAL相关实例全局单例初始化

你当前贴出的MSAL配置、Graph Client初始化逻辑必须仅执行一次,要放在全局作用域,禁止放在组件内部、路由钩子或者getUser函数中,避免每次调用接口都创建新实例触发重复登录。

2. 页面初始化优先处理重定向登录回调

你使用的是重定向登录模式,页面加载后必须先处理MSAL的重定向回调,确认登录状态完成后再发起接口请求,避免回调未处理时接口自动触发新的登录流程,示例代码如下:

// 页面初始化时优先执行
msalApplication.handleRedirectPromise()
  .then(res => {
    if (res?.account) {
      // 登录状态已确认,再执行拉取用户逻辑
      getUser()
    } else if (!msalApplication.getAccount()) {
      // 无有效登录态时主动触发一次登录,避免自动触发多次
      msalApplication.loginRedirect({ scopes: graphScopes })
    }
  })
  .catch(err => console.error('登录回调处理失败:', err))

3. 加锁避免重复触发登录请求

新增全局登录状态标记,防止多次点击、并发请求触发重复登录:

let isLoggingIn = false
const getUser = async () => {
  // 登录中或者无有效账户时直接返回,避免重复请求
  if (isLoggingIn || !msalApplication.getAccount()) return []
  let list = []
  try {
    isLoggingIn = true
    list = await client.api("https://graph.microsoft.com/beta/users?$count=true&$top=5").header("ConsistencyLevel", "eventual").get();
  } catch (error) {
    throw error
  } finally {
    isLoggingIn = false
  }
  return list;
};

4. 精简权限配置

你当前配置的权限存在冗余,只需保留最小必要权限即可,多余的权限会触发多次权限同意流程,引发重复登录请求。拉取用户列表仅需保留以下权限:

const graphScopes = [
  "User.Read.All",
  "Directory.Read.All"
];

5. 避免并发调用接口

如果有多个场景同时调用getUser,需要做请求合并,第一次请求未返回时,后续调用直接复用第一次的请求结果,不要重复发起接口调用触发多次令牌获取流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 12:36:03