runtimeZero
runtimeZero

Reputation: 28046

Angular interceptor not intercepting 401 responses

I have created http interceptors and attached to my main app as below:

angular.module('app',['ui.router'])
.factory('AuthInterceptor',function($window,$q){
  return{
    request: function(config){
      console.log("config object is");
      console.log(config);
      if($window.sessionStorage.getItem('token')){
        config.headers['x-access-token']= $window.sessionStorage.getItem('token');
      }
      return config || $q.when(config);

    },

    response: function(response){

     console.log("response object is:");
     console.log(response);

      if (response['status'] >= 400) {
       console.log("Not Authorized.kindly login first");
        $state.transitionTo('login');
      }
      return response || $q.when(response);

    }


  };
})

.config(function($httpProvider){
  $httpProvider.interceptors.push('AuthInterceptor');
});

On the server-side (some express code) I am checking if the user is authorized or not and if not I respond with the following code (only displaying a subset of code to keep things concise):

if(!req.user){  
   res.send('Not authorized',400);
}

The server code works fine (i can see it in the network tab of the chrome developer tools) However AuthInterceptor.response() does nto get called. However do note that the AuthInterceptor.response() does get executed when the response status is 200

So I am confused.. why is it not intercepting 400 statuses ?

Upvotes: 2

Views: 819

Answers (1)

gkalpak
gkalpak

Reputation: 48212

If the response status code is outside of the range [200-299], then the responseError interceptor is called.

You need to provide a responseError interceptor:

return {
    request: function (config) {...},
    responseError: function (rejection) {...}
};

Upvotes: 6

Related Questions