在任何其他请求之前发出$ http请求Angular JS

时间:2016-04-14 16:48:30

标签: angularjs jwt angular-http-interceptors

每当我在任何请求之前发出$ http请求时,我都会遇到流行的循环依赖问题。我之前见过这些问题:

我真的不知道上面的这些问题是否试图让我想要实现同样的目标。我想发一个$ http请求来检查我的JWT令牌的完整性,我需要在我的服务器端执行此操作。如果令牌已过期,我需要为用户提供另一个令牌。

这是我的代码

var app = angular.module('app', ['ngRoute', 'ngStorage']);

app.factory('requestInterceptor', ['$q', '$localStorage', '$location', function($q, $localStorage, $location)
{
    var requestInterceptor = {};

    requestInterceptor.request = function(config)
    {
//        $http
//        ({
//           url : 'api/token',
//           method: 'GET',
//           headers : { Authorization : $localStorage.token}
//        }).then(function(response){
//           $localStorage.token = response.data.token;
//        },function(response){
//           $localStorage.token = null;
//           $location.path('/');
//        });           

        config.headers = config.headers || {};
        if ($localStorage.token)
        {
            config.headers.Authorization = 'Bearer ' + $localStorage.token;
        }
        return config;        
    };

    requestInterceptor.responseError =  function (response)
    {
        if (response.status === 401 || response.status === 403)
        {
            $location.path('/signin');
        }
        return $q.reject(response);
    };

    return requestInterceptor;
}]);

注意

无法使用Angular-JWT

1 个答案:

答案 0 :(得分:0)

尝试将令牌验证抽象到其他服务中。我没有测试它^但它应该工作。

app.factory('auth', ['$http', '$localStorage', '$location', function($http, $localStorage, $location){
  return {
    validateToken: function() {
      return $http({
        url : 'api/token',
        method: 'GET',
        headers : { Authorization : $localStorage.token}
      }).then(function(response){
        $localStorage.token = response.data.token;
        return response.data.token;
      },function(response){
        $localStorage.token = null;
        $location.path('/');
      });       
    }
  }
}]);

app.factory('requestInterceptor', ['auth', function(auth){
  var requestInterceptor = {};

  requestInterceptor.request = function(config){
    if (!config.url.startsWith('api/token')) {
      auth.validateToken().then(function(token){
        config.headers = config.headers || {};
        config.headers.Authorization = 'Bearer ' + token;
        return config;   
      });
    } else {
      return config;   
    }
  };

  return requestInterceptor;
}]);