Axios intercepteurs et asynchrone de connexion
Je suis la mise en œuvre de jeton d'authentification dans mon application web. Mon access token
expire toutes les N minutes et qu'un refresh token
est utilisé pour la connexion et d'obtenir un nouveau access token
.
- Je utiliser Axios pour tous mes appels de l'API. J'ai un intercepteur mis en place pour intercepter 401
réponses.
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
})
En gros, comme je l'interception d'une réponse 401, je veux faire un login et de réessayer l'original a rejeté la demande avec les nouveaux jetons. Mon serviceRefreshLogin
appels de fonction setAccessToken()
dans son then
bloc. Mais le problème est que
le then
bloc arrive plus tard que la getAccessToken()
dans l'intercepteur, de sorte que la nouvelle tentative qui se passe avec l'ancien expiré informations d'identification.
getAccessToken()
et getRefreshToken()
il suffit de retourner l'existant jetons stockés dans le navigateur (ils gèrent localStorage, cookies, etc).
Comment puis-je assurer les déclarations ne pas exécuter jusqu'à ce qu'une promesse de rendements?
(Voici un numéro correspondant sur github: https://github.com/mzabriskie/axios/issues/266)
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser une autre promesse 😀
Si votre environnement ne prend pas de suport promesses utilisation polyfill, par exemple https://github.com/stefanpenner/es6-promise
Mais, il peut être préférable de réécrire getRefreshToken de retour promesse et ensuite de rendre le code plus simple
Démo https://plnkr.co/edit/0ZLpc8jgKI18w4c0f905?p=preview
Pourrait le faire à la demande au lieu de la réponse, et il serait probablement plus propre car il faudrait éviter de heurter le serveur lorsque le jeton d'accès est expiré. La copie de cet article:
JS: