AngularJS – http拦截器 – 在令牌刷新后重新发送所有请求

前端之家收集整理的这篇文章主要介绍了AngularJS – http拦截器 – 在令牌刷新后重新发送所有请求前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个有角度的应用程序,有时每个状态会执行多个$ http.get请求。该应用程序使用JWT进行用户验证刷新令牌。 API服务器在由于auth错误而失败的每个请求发送401。
我制作了一个http拦截器,请求一个新的令牌与401错误的刷新令牌,然后重新发送原始请求。

问题是,如果状态例如2 $ http.get请求,并且都获得401响应,那么我更新访问令牌两次。显然我只想刷新一次令牌,但是我仍然想重新发送两个失败的请求。

这是可以实现的吗?

  1. app.factory('AuthInterceptor',function($q,$injector,RESOURCE_URL,API_BASE,authService) {
  2. return {
  3. request: function(config) {
  4. config.headers = config.headers || {};
  5. if (authService.getAccessToken()) {
  6. if (config.url.substring(0,RESOURCE_URL.length) !== RESOURCE_URL) {
  7. config.headers.Authorization = 'Bearer ' + authService.getAccessToken();
  8. }
  9. }
  10. return config;
  11. },responseError: function(response) {
  12. switch (response.status) {
  13. case 401:
  14. var deferred = $q.defer();
  15. $injector.get("$http").post(API_BASE + '/api/auth/refresh',{refreshtoken: authService.getRefreshToken()}).then(function(r) {
  16. if (r.data.data.accesstoken && r.data.data.refreshtoken && r.data.data.expiresin) {
  17. authService.setAccessToken(r.data.data.accesstoken);
  18. authService.setRefreshToken(r.data.data.refreshtoken);
  19. authService.setExpiresIn(r.data.data.expiresin);
  20. $injector.get("$http")(response.config).then(function(resp) {
  21. deferred.resolve(resp);
  22. },function(resp) {
  23. deferred.reject();
  24. });
  25. } else {
  26. deferred.reject();
  27. }
  28. },function(response) {
  29. deferred.reject();
  30. authService.clear();
  31. $injector.get("$state").go('guest.login');
  32. return;
  33. });
  34. return deferred.promise;
  35. break;
  36. default:
  37. authService.clear();
  38. $injector.get("$state").go('guest.login');
  39. break;
  40. }
  41. return response || $q.when(response);
  42. }
  43. };
  44. });
你的拦截器需要跟踪它是否有飞行中的认证请求。它可以通过保留对认证请求返回的承诺的引用来做到这一点。如果有飞行中的请求,并且获得另一个401,只需使用缓存的承诺,而不是发起新的请求。
  1. app.factory('AuthInterceptor',authService) {
  2. var inFlightAuthRequest = null;
  3. return {
  4. request: function(config) {
  5. config.headers = config.headers || {};
  6. if (authService.getAccessToken()) {
  7. if (config.url.substring(0,responseError: function(response) {
  8. switch (response.status) {
  9. case 401:
  10. var deferred = $q.defer();
  11. if(!inFlightAuthRequest) {
  12. inflightAuthRequest = $injector.get("$http").post(API_BASE + '/api/auth/refresh',{refreshtoken: authService.getRefreshToken()});
  13. }
  14. inflightAuthRequest.then(function(r) {
  15. inflightAuthRequest = null;
  16. if (r.data.data.accesstoken && r.data.data.refreshtoken && r.data.data.expiresin) {
  17. authService.setAccessToken(r.data.data.accesstoken);
  18. authService.setRefreshToken(r.data.data.refreshtoken);
  19. authService.setExpiresIn(r.data.data.expiresin);
  20. $injector.get("$http")(response.config).then(function(resp) {
  21. deferred.resolve(resp);
  22. },function(response) {
  23. inflightAuthRequest = null;
  24. deferred.reject();
  25. authService.clear();
  26. $injector.get("$state").go('guest.login');
  27. return;
  28. });
  29. return deferred.promise;
  30. break;
  31. default:
  32. authService.clear();
  33. $injector.get("$state").go('guest.login');
  34. break;
  35. }
  36. return response || $q.when(response);
  37. }
  38. };
  39. });

猜你在找的Angularjs相关文章