ToB企服应用市场:ToB评测及商务社交产业平台

标题: Vue3 + Axios双Token刷新办理方案 [打印本页]

作者: 鼠扑    时间: 2024-11-14 02:39
标题: Vue3 + Axios双Token刷新办理方案
        在当代前端开辟中,使用 API 进行数据交互时,我们常常会碰到身份认证的问题。为了提高安全性,许多应用接纳了 Token 机制,如 JWT(JSON Web Token)来管理用户的身份状态。本文将介绍如何在 Vue3 项目中使用 Axios 实现双 Token 刷新机制,确保用户体验流畅的同时提高安全性。
前置条件

      刷新机制

        在完成上述步骤后,我们就可以开始对前端项目进行操作了。但起首,我们需要相识到双Token刷新的机制:
   在使用 Token 认证时,我们通常会使用两种 Token:
    当 Access Token 逾期时,我们可以使用 Refresh Token 来请求新的 Access Token,而不是要求用户重新登录。通过这种方式,用户的体验将更加平滑。
          但是,这里是博主自己写的后端,博主的服务端在双Token刷新机制上的原理跟上述是一样的, 不同的是,博主在生成Token的时间,并没有将Refresh Token 返回给前端,而是跟UserId一起以键值对的情势存储在了Redis中。
        在客户端Access Token逾期后,直接根据Base64剖析出Access Token载荷中的UserId,然后根据这个UserId查询存储在Redis中的Refresh Token,如果这个Refresh Token有用且是合法的,那么我们就根据之前Access Token载荷中的信息重新生成一个Access Token返回给客户端,以此来达到刷新Token的目的。
   根据以上Token刷新机制,我们在Vue3前端代码中,可以给出一个无感刷新Token的思路:
  
  代码实现

  1. // 添加响应拦截器
  2. service.interceptors.response.use(
  3.         async (response) => {
  4.         // 判断是否有新的Token
  5.                 if (response.data.ACCESS_TOKEN) {
  6.             // 将服务端返回的新Token存储到Session中
  7.                         Session.set('token', response.data.ACCESS_TOKEN);
  8.                         // 重新发送原始请求
  9.             const config = response.config;
  10.             try {
  11.                 const newResponse = await service.request(config);
  12.                 return newResponse;
  13.             } catch (error) {
  14.                 return Promise.reject(error);
  15.             }
  16.                 }
  17.                 // 对响应数据做点什么
  18.                 const res = response.data;
  19.                 if (res.code && res.code !== 0) {
  20.                         // `token` 过期或者账号已在别处登录
  21.                         if (res.code === 401 || res.code === 4001) {
  22.                                 Session.clear(); // 清除浏览器全部临时缓存
  23.                                 window.location.href = '/'; // 去登录页
  24.                                 ElMessageBox.alert('你已被登出,请重新登录', '提示', {})
  25.                                         .then(() => { })
  26.                                         .catch(() => { });
  27.                                 return Promise.reject(service.interceptors.response);
  28.                         } else {   // 如果响应中有新的 token,则更新 Session 中的 token
  29.                                 return res;
  30.                         }
  31.                 } else {
  32.                         return res;
  33.                 }
  34.         },
  35.         (error) => {
  36.                 // 对响应错误做点什么
  37.                 if (error.message.indexOf('timeout') != -1) {
  38.                         ElMessage.error('网络超时');
  39.                 } else if (error.message == 'Network Error') {
  40.                         ElMessage.error('网络连接错误');
  41.                 } else {
  42.                         if (error.response.data) ElMessage.error(error.response.statusText);
  43.                         else ElMessage.error('接口路径找不到');
  44.                 }
  45.                 return Promise.reject(error);
  46.         }
  47. );
复制代码
 查验真理


   如图,当Token逾期时,我们访问这个查询接口时,Axios进行了两次接口调用 
  

   第一次调用这个查询接口时,我们的Token失效了,拿到了服务端给的新的Token 
  

           然后,根据我们之前在Axios响应拦截器中的代码逻辑,它在将这个新的Token存储到Session中后,又重新发送了一次原始请求

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4