关于Jwt的刷新问题想要请教老师

来源:11-13 鉴权守卫:设置鉴权用户可访问的控制器(作业)

LinkeZ

2023-11-14

您好Brian老师,关于Jwt如果设置的有效时间比较短,刷新Jwt的业务逻辑您建议写在Nest生命周期中的哪里比较好呢?还是在每次请求API时将新的Jwt添加在Service的返回数据中呢?

写回答

1回答

Brian

2023-11-15

Nest生命周期中的哪里比较好呢?——直接在auth模块中,加入一个refresh的post接口啊?由前端自行来处理。


前端,比如vue中可以加在axios的拦截器里面来处理401的错误,如果是401,则把旧的token,使用新的axios实例来请求refresh接口。逻辑大概如下:


import axios from 'axios';

// 创建一个 Axios 实例
const api = axios.create({
  baseURL: '你的API基础URL',
  // 其他配置...
});

// 添加响应拦截器
api.interceptors.response.use(response => {
  return response;
}, async error => {
  const originalRequest = error.config;
  
  // 检查错误类型是否为 401
  if (error.response.status === 401 && !originalRequest._retry) {
    
    originalRequest._retry = true;
    const refreshApi = axios.create(); // 创建新的 axios 实例进行刷新操作

    try {
      // 假设你的刷新 token 接口如下
      const { data } = await refreshApi.post('/refresh_token', {
        // 你的刷新 token 逻辑
      });
      
      // 存储新的 token
      localStorage.setItem('token', data.token);

      // 更新原请求的 headers
      originalRequest.headers['Authorization'] = 'Bearer ' + data.token;

      // 用新的 token 重试原始请求
      return api(originalRequest);
    } catch (refreshError) {
      // 处理刷新 token 失败的逻辑
      return Promise.reject(refreshError);
    }
  }

  return Promise.reject(error);
});

export default api;



0
1
LinkeZ
谢谢老师,我的开发经验太少这个问题卡住了很多天,总是想在后端中解决。
2023-11-15
共1条回复

NestJS 入门到实战 前端必学服务端新趋势

近几年快速发展的Node.js框架,掌握未来前端工程师后端开发能力

569 学习 · 238 问题

查看课程