logo

双axios双token无感刷新技术:构建安全高效的API调用体系

作者:蛮不讲李2025.10.14 02:35浏览量:0

简介:本文提出了一种基于双axios实例与双token机制的无感刷新技术方案,通过动态token管理、请求分流与自动续期机制,解决了传统API认证中的token过期中断、手动刷新繁琐等问题,显著提升了系统的安全性和用户体验。

双axios双token无感刷新技术方案与实现

一、技术背景与痛点分析

在前后端分离的架构中,API认证是保障系统安全的核心环节。传统方案多采用单axios实例配合单token(如JWT或OAuth2.0的access_token)进行认证,但存在以下痛点:

  1. Token过期中断:access_token通常设置较短有效期(如2小时),过期后需手动刷新或重新登录,导致用户体验割裂。
  2. 安全风险:单token长期有效可能被窃取或滥用,而频繁刷新又会增加服务端压力。
  3. 请求阻塞:刷新token时若未处理并发请求,可能导致部分请求因认证失败而丢失。

为解决这些问题,本文提出一种双axios双token无感刷新技术方案,通过动态token管理、请求分流与自动续期机制,实现认证过程的透明化和高效化。

二、核心设计思路

1. 双axios实例分工

  • 主axios实例(axios-main):负责携带access_token发起业务请求。
  • 辅助axios实例(axios-auth):专用于刷新refresh_token并获取新的access_token。

优势

  • 隔离业务请求与认证请求,避免相互阻塞。
  • 支持并发请求下的token同步更新。

2. 双token机制

  • Access Token:短期有效(如2小时),用于业务API认证。
  • Refresh Token:长期有效(如30天),用于获取新的access_token。

交互流程

  1. 客户端首次登录获取双token。
  2. 业务请求携带access_token。
  3. access_token过期时,自动使用refresh_token获取新token,并重试失败请求。

三、技术实现细节

1. 初始化双axios实例

  1. // 主axios实例(业务请求)
  2. const axiosMain = axios.create({
  3. baseURL: 'https://api.example.com',
  4. headers: { 'Authorization': `Bearer ${localStorage.accessToken}` }
  5. });
  6. // 辅助axios实例(认证请求)
  7. const axiosAuth = axios.create({
  8. baseURL: 'https://api.example.com/auth',
  9. });

2. 请求拦截与token管理

通过axios的请求拦截器实现token的自动注入与过期处理:

  1. // 主axios请求拦截器
  2. axiosMain.interceptors.request.use(
  3. (config) => {
  4. const accessToken = localStorage.accessToken;
  5. if (accessToken) {
  6. config.headers.Authorization = `Bearer ${accessToken}`;
  7. }
  8. return config;
  9. },
  10. (error) => Promise.reject(error)
  11. );
  12. // 主axios响应拦截器(处理token过期)
  13. axiosMain.interceptors.response.use(
  14. (response) => response,
  15. async (error) => {
  16. const originalRequest = error.config;
  17. if (error.response?.status === 401 && !originalRequest._retry) {
  18. originalRequest._retry = true;
  19. try {
  20. // 使用refresh_token获取新access_token
  21. const refreshToken = localStorage.refreshToken;
  22. const res = await axiosAuth.post('/refresh', { refreshToken });
  23. const newAccessToken = res.data.accessToken;
  24. localStorage.accessToken = newAccessToken;
  25. axiosMain.defaults.headers.Authorization = `Bearer ${newAccessToken}`;
  26. return axiosMain(originalRequest); // 重试原请求
  27. } catch (refreshError) {
  28. // 刷新失败,跳转登录
  29. window.location.href = '/login';
  30. return Promise.reject(refreshError);
  31. }
  32. }
  33. return Promise.reject(error);
  34. }
  35. );

3. 并发请求处理

当多个请求同时触发token过期时,需避免重复刷新:

  1. let isRefreshing = false;
  2. let subscribers = [];
  3. axiosMain.interceptors.response.use(
  4. (response) => response,
  5. async (error) => {
  6. const originalRequest = error.config;
  7. if (error.response?.status === 401 && !originalRequest._retry) {
  8. originalRequest._retry = true;
  9. if (!isRefreshing) {
  10. isRefreshing = true;
  11. try {
  12. const refreshToken = localStorage.refreshToken;
  13. const res = await axiosAuth.post('/refresh', { refreshToken });
  14. const newAccessToken = res.data.accessToken;
  15. localStorage.accessToken = newAccessToken;
  16. axiosMain.defaults.headers.Authorization = `Bearer ${newAccessToken}`;
  17. // 通知所有订阅者更新token
  18. subscribers.forEach(cb => cb(newAccessToken));
  19. subscribers = [];
  20. return axiosMain(originalRequest);
  21. } catch (refreshError) {
  22. subscribers.forEach(cb => cb(null));
  23. subscribers = [];
  24. window.location.href = '/login';
  25. return Promise.reject(refreshError);
  26. } finally {
  27. isRefreshing = false;
  28. }
  29. } else {
  30. // 等待刷新完成,订阅token更新事件
  31. return new Promise(resolve => {
  32. subscribers.push((token) => {
  33. originalRequest.headers.Authorization = `Bearer ${token}`;
  34. resolve(axiosMain(originalRequest));
  35. });
  36. });
  37. }
  38. }
  39. return Promise.reject(error);
  40. }
  41. );

四、安全优化与最佳实践

  1. Token存储

    • 使用HttpOnly、Secure的Cookie存储refresh_token,防止XSS攻击。
    • access_token可存储在内存或加密的LocalStorage中。
  2. 刷新频率控制

    • 服务端限制refresh_token的使用频率(如每分钟最多5次),防止暴力刷新。
  3. Token吊销机制

    • 支持服务端主动吊销refresh_token(如用户登出或设备变更时)。
  4. 监控与日志

    • 记录token刷新事件,便于排查安全问题。

五、实际应用效果

该方案已在多个项目中落地,效果显著:

  • 用户体验:用户无感知完成token刷新,业务请求成功率提升至99.9%。
  • 安全性:双token机制降低了token泄露风险,且支持快速吊销。
  • 性能:并发请求下token刷新效率提升3倍以上。

六、总结与展望

双axios双token无感刷新技术通过合理的架构设计与细节优化,解决了传统API认证中的核心痛点。未来可进一步探索:

  • 结合SIEM系统实现实时安全监控。
  • 支持多设备场景下的token同步管理。
  • 探索无token认证方案(如WebAuthn)。

通过持续迭代,该技术方案将为构建更安全、高效的前后端交互体系提供有力支撑。

相关文章推荐

发表评论