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

如何刷新mgt-login获取的Access Token?后端调用Graph API遇过期问题

解决方案

前端侧处理(推荐)

1. 每次请求后端前重新获取最新Token

不要在登录后一次性获取Token并长期缓存,而是每次发起后端请求前都调用getAccessToken方法获取Token。Providers.globalProvider内部会自动检测当前Token是否即将过期,若过期则自动使用Refresh Token刷新,返回最新的有效Token:

// 每次调用后端接口前执行
const msAccessToken = await Providers.globalProvider.getAccessToken({ scopes: this.scopes });
// 携带最新Token调用后端接口

2. 监听令牌更新事件

通过监听ProviderUpdated事件,在令牌自动刷新后更新后续请求使用的Token:

Providers.globalProvider.onProviderUpdated(() => {
  // 令牌已更新,后续请求将使用新Token
  // 可在此重置存储的Token变量
});

后端侧处理

如果前端未处理Token刷新,后端可以捕获Token过期错误,返回特定状态码触发前端重新获取Token并重试请求:

1. 捕获Graph客户端错误

在后端调用Graph API的逻辑中,捕获Access token has expired or is not yet valid错误,返回401响应:

try {
  // 调用Graph API的业务逻辑
} catch (error) {
  if (error.message.includes('Access token has expired or is not yet valid')) {
    res.status(401).send('Token expired, please refresh and retry');
  } else {
    // 处理其他类型错误
  }
}

2. 前端拦截401重试

前端在请求拦截器中捕获401响应,重新获取Token后重试原请求(以axios为例):

axios.interceptors.response.use(
  response => response,
  async error => {
    if (error.response.status === 401 && error.response.data.includes('Token expired')) {
      // 获取新的有效Token
      const newToken = await Providers.globalProvider.getAccessToken({ scopes: this.scopes });
      // 更新请求头的Token
      error.config.headers['Authorization'] = `Bearer ${newToken}`;
      // 重试原请求
      return axios(error.config);
    }
    return Promise.reject(error);
  }
);

关键说明

  • Access Token的有效期由微软统一设定(默认1小时),无法直接延长,只能通过Refresh Token刷新获取新的有效Token。
  • Microsoft Graph Toolkit的Providers.globalProvider会自动管理Refresh Token的存储与刷新逻辑,无需手动操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:00:01