La lógica: en cada solicitud hay un encabezado de autorización JWT que autentica al usuario. Si eso caduca, hay un punto final de cookie listo para actualizar el JWT.
Estoy usando axios y la respuesta del interceptor para verificar si el cliente obtiene un 401 para intentar actualizar el JWT. La cookie puede ser válida o no.
El problema es que el interceptor para refrescar el JWT nunca deja de disparar, y creo que tengo algo mal con la sincronización de las solicitudes. A continuación se muestra mi código:
function refreshToken(dispatch) { return new Promise((resolve, reject) => { instance.put('/auth').then((response) => { dispatch({ type: "UPDATE_AUTH", payload: response.data }); resolve(response); }) .catch((error) => { reject(error); }); }); } instance.interceptors.response.use( response => { return response; }, err => { const error = err.response; if (error.status === 401 && error.config && !error.config._retry) { error.config._retry = true; return refreshToken(dispatch).then((resp) => { return instance(error.config); }) .catch((e) => { return Promise.reject(e); }); } return Promise.reject(error); } );Si tiene más de una solicitud paralela, actualizar el JWT será igual a la cantidad de solicitudes. Intente enviar /auth solo la primera vez y evite las próximas solicitudes. Puede usar localStorage para esta tarea.
let requests = []; instance.interceptors.response.use( response => { return response; }, err => { const error = err.response; if (error.status === 401 && error.config && !error.config._retry) { requests.push(error.config); if (!localStorage.getItem('refresh')) { localStorage.setItem('refresh', 'done'); error.config._retry = true; return refreshToken(dispatch).then((resp) => { localStorage.removeItem('refresh'); const token = getAccessToken(); requests.map(req => { req.headers.Authorization = `Bearer ${token}`; return instance(req) }) }) .catch((e) => { localStorage.removeItem('refresh'); return Promise.reject(e); }); } } else { requests = []; } return Promise.reject(error); } );