如何刷新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
相关产品推荐
相关产品推荐

