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

React应用基于react-adal集成Azure AD后,如何刷新会话或延长令牌有效期?

解决react-adal中Azure AD令牌过期自动登出的问题

我来帮你搞定这个令牌1小时过期的问题——其实react-adal本身就自带了令牌自动刷新的能力,只是你当前的代码没有充分利用它的机制。下面结合你的代码一步步调整:

1. 别直接从localStorage取令牌,用authContext的方法

你现在的graphAccessToken()直接读取localStorage的令牌,这会跳过react-adal内置的令牌刷新逻辑。adal的AuthenticationContext会自动跟踪令牌的过期时间,在需要时静默刷新,所以应该用它提供的方法来获取有效令牌。

修改你的令牌获取和请求函数:

// 替换原来的graphAccessToken和azureRequest
function azureRequest(url) {
  return new Promise((resolve, reject) => {
    // 每次请求前调用acquireToken,确保拿到有效令牌
    authContext.acquireToken('https://graph.microsoft.com', (error, token) => {
      if (error) {
        console.error('获取Graph令牌失败:', error);
        // 如果是需要用户交互的错误(比如刷新令牌也过期了),引导重新登录
        if (error.message.includes('interaction_required')) {
          authContext.login();
        }
        reject(error);
        return;
      }
      // 拿到有效令牌后,更新localStorage(可选,不过建议优先依赖authContext的缓存)
      localStorage.setItem(config.graph_access_token_key, token);
      
      const requestOptions = {
        method: 'GET',
        headers: {
          'Content-Type': 'application/json',
          Authorization: `Bearer ${token}`
        }
      };
      fetch(url, requestOptions)
        .then(response => response.json())
        .then(resolve)
        .catch(reject);
    });
  });
}

这个修改的核心是每次请求都通过acquireToken获取令牌,它内部会检查当前缓存的令牌是否即将过期:如果有效就直接返回,如果快过期了会自动发起静默刷新请求,拿到新的令牌后再返回。

2. 确保配置支持静默刷新

你的adalConfig已经设置了cacheLocation: 'localStorage',这很重要——刷新令牌会存在localStorage里,允许应用在后台静默刷新。另外还要确认Azure AD应用注册的两个设置:

  • 启用了隐式授权流(如果你的应用用的是隐式模式)
  • redirectUri和应用实际的地址完全匹配,包括http/https协议和端口

3. 优化应用初始化逻辑

在应用加载时,确保检查令牌的有效性,并自动触发刷新:

authContext.handleWindowCallback();
if (window === window.parent) {
  if (!authContext.isCallback(window.location.hash)) {
    const hasValidToken = authContext.getCachedToken(authContext.config.clientId);
    const hasUser = authContext.getCachedUser();
    
    if (hasValidToken || hasUser) {
      // 提前获取Graph令牌,确保会话有效
      authContext.acquireToken('https://graph.microsoft.com', (error, id_token) => {
        if (id_token) {
          localStorage.setItem(config.graph_access_token_key, id_token);
          // 你的其他初始化逻辑
        } else if (error) {
          // 令牌无效,引导登录
          authContext.login();
        }
      });
    } else {
      // 没有有效会话,直接登录
      authContext.login();
    }
  }
}

4. 关于会话“延长”的说明

Azure AD的访问令牌默认有效期就是1小时,无法直接修改这个时长,但通过刷新令牌可以持续获取新的访问令牌,从而维持会话。只要用户在应用中有操作,刷新令牌可以一直生成新的访问令牌,直到用户90天未操作(刷新令牌过期),这时候才需要重新登录。

总结一下:核心就是不要绕过react-adal的令牌管理机制,用它的acquireToken方法来获取令牌,它会自动帮你处理刷新逻辑,避免1小时后自动登出的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:27:35