Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

676
Views
Interceptores Axios e inicio de sesión asíncrono

Estoy implementando la autenticación de token en mi aplicación web. Mi access token caduca cada N minutos y luego se usa un refresh token para iniciar sesión y obtener un nuevo access token .

Uso Axios para todas mis llamadas a la API. Tengo un interceptor configurado para interceptar respuestas 401 .

 axios.interceptors.response.use(undefined, function (err) { if (err.status === 401 && err.config && !err.config.__isRetryRequest) { serviceRefreshLogin( getRefreshToken(), success => { setTokens(success.access_token, success.refresh_token) }, error => { console.log('Refresh login error: ', error) } ) err.config.__isRetryRequest = true err.config.headers.Authorization = 'Bearer ' + getAccessToken() return axios(err.config); } throw err })

Básicamente, cuando intercepto una respuesta 401, quiero iniciar sesión y luego volver a intentar la solicitud original rechazada con los nuevos tokens. Mi función serviceRefreshLogin llama a setAccessToken() en su bloque then . Pero el problema es que el bloque then ocurre más tarde que getAccessToken() en el interceptor, por lo que el reintento ocurre con las credenciales caducadas.

getAccessToken() y getRefreshToken() simplemente devuelven los tokens existentes almacenados en el navegador (administran almacenamiento local, cookies, etc.).

¿Cómo me aseguraría de que las declaraciones no se ejecuten hasta que regrese una promesa?

(Aquí hay un problema correspondiente en github: https://github.com/mzabriskie/axios/issues/266 )

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Solo usa otra promesa :D

 axios.interceptors.response.use(undefined, function (err) { return new Promise(function (resolve, reject) { if (err.status === 401 && err.config && !err.config.__isRetryRequest) { serviceRefreshLogin( getRefreshToken(), success => { setTokens(success.access_token, success.refresh_token) err.config.__isRetryRequest = true err.config.headers.Authorization = 'Bearer ' + getAccessToken(); axios(err.config).then(resolve, reject); }, error => { console.log('Refresh login error: ', error); reject(error); } ); } throw err; }); });

Si su entorno no admite promesas, use polyfill, por ejemplo, https://github.com/stefanpenner/es6-promise

Pero, puede ser mejor reescribir getRefreshToken para devolver la promesa y luego simplificar el código

 axios.interceptors.response.use(undefined, function (err) { if (err.status === 401 && err.config && !err.config.__isRetryRequest) { return getRefreshToken() .then(function (success) { setTokens(success.access_token, success.refresh_token) ; err.config.__isRetryRequest = true; err.config.headers.Authorization = 'Bearer ' + getAccessToken(); return axios(err.config); }) .catch(function (error) { console.log('Refresh login error: ', error); throw error; }); } throw err; });

Demostración https://plnkr.co/edit/0ZLpc8jgKI18w4c0f905?p=preview

over 4 years ago · Santiago Trujillo Report

0

Podría hacerlo en la solicitud en lugar de la respuesta, y probablemente sería más limpio, ya que evitaría acceder al servidor cuando el token de acceso caduque. Copiando de este artículo :

 function issueToken() { return new Promise((resolve, reject) => { return client({ ... }).then((response) => { resolve(response); }).catch((err) => { reject(err); }); }); } client.interceptors.request.use((config) => { let originalRequest = config; if (tokenIsExpired && path_is_not_login) { return issueToken().then((token) => { originalRequest['Authorization'] = 'Bearer ' + token; return Promise.resolve(originalRequest); }); } return config; }, (err) => { return Promise.reject(err); });

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!