Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

677
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda