React应用基于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

