AngularJS - http intercepteur - renvoyer tous demande après jeton d'actualisation
J'ai angulaire de l'app, qui parfois ne plusieurs $http.requêtes get par l'état. L'application usees JWT pour l'authentification de l'utilisateur avec l'actualisation des jetons. L'API serveur envoie 401
sur chaque demande qui a échoué en raison d'auth erreur.
J'ai fait une http interceptor
que les demandes de un nouveau jeton d'actualisation jeton sur la 401 erreurs et après qui vous renvoie la demande d'origine.
Le problème est que, si un état fait par exemple, 2 $http.les requêtes get et les deux obtiennent une réponse 401 puis-je renouveler le jeton d'accès deux fois. Évidemment, je ne veux actualiser le jeton d'une fois, MAIS j'ai encore envie de le renvoyer à la FOIS les demandes ayant échoué.
Est-ce réalisable et si oui, comment?
app.factory('AuthInterceptor', function($q, $injector, RESOURCE_URL, API_BASE, authService) {
return {
request: function(config) {
config.headers = config.headers || {};
if (authService.getAccessToken()) {
if (config.url.substring(0, RESOURCE_URL.length) !== RESOURCE_URL) {
config.headers.Authorization = 'Bearer ' + authService.getAccessToken();
}
}
return config;
},
responseError: function(response) {
switch (response.status) {
case 401:
var deferred = $q.defer();
$injector.get("$http").post(API_BASE + '/api/auth/refresh', {refreshtoken: authService.getRefreshToken()}).then(function(r) {
if (r.data.data.accesstoken && r.data.data.refreshtoken && r.data.data.expiresin) {
authService.setAccessToken(r.data.data.accesstoken);
authService.setRefreshToken(r.data.data.refreshtoken);
authService.setExpiresIn(r.data.data.expiresin);
$injector.get("$http")(response.config).then(function(resp) {
deferred.resolve(resp);
},function(resp) {
deferred.reject();
});
} else {
deferred.reject();
}
}, function(response) {
deferred.reject();
authService.clear();
$injector.get("$state").go('guest.login');
return;
});
return deferred.promise;
break;
default:
authService.clear();
$injector.get("$state").go('guest.login');
break;
}
return response || $q.when(response);
}
};
});
- vous pouvez poster l'extrait de code de votre intercepteur et comment vous renvoyer la demande?
- ne stackoverflow.com/questions/18638211/... aider à répondre?
- Je ne reçois pas une lib soit. Le
event:auth-loginRequired
serait encore le feu deux fois faire de l'app actualiser le jeton à deux reprises. Suis-je tort? Ce qui me manque?
Vous devez vous connecter pour publier un commentaire.
Votre intercepteur besoin de garder une trace de savoir si elle a ou non une demande d'authentification "en vol". Elle peut le faire en gardant une référence à la promesse retourné par la requête d'authentification. Si il y a une demande en vol, et vous obtenez un autre 401, utilisez simplement que la mise en cache promesse au lieu de l'ouverture d'une nouvelle demande. Aussi, vous devriez envisager d'ajouter de la logique de compte pour le cas où '/api/auth/actualiser' lui-même renvoie à un 401.
La solution de Joe Enzminger est grande. Mais j'ai eu quelques problèmes avec la fonction de rappel qu'il ne s'est pas exécuté.
Ensuite, j'ai remarqué une petite faute de frappe dans inflightAuthRequest/inFlightAuthRequest.
Ma solution complète est maintenant: