调用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
相关产品推荐
相关产品推荐

