我在处理应用程序范围内的 401 错误方面遇到了一些困难。
其他一些帖子对我没有真正的帮助: Angularjs - handling 401's for entire app 401 unauthorized error handling in AngularJS
我必须发送一个身份验证 token ,如果它在每个请求上都定义了,这就是为什么我需要在拦截器中包含一个请求部分。
我当前的方法如下:
module.factory('authInterceptor', function ($rootScope, $q, $window, $location) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
else{
console.log("authInterceptor: No Token to send")
}
return config;
},
response: function (response) {
if (response.status == 401) {
console.log("No Logged In");
$location.path('/login');
}
return response || $q.when(response);
},
responseError: function(rejection){
var defer = $q.defer();
if(rejection.status == 401){
console.log("401 Rejection");
console.dir(rejection);
}
defer.reject(rejection);
return defer.promise;
}
};
});
就我的调试而言,如果请求后发生 401,它将在 repsonse 函数中处理。这本身就给了原始调用者一个 promise 。
如果我注释掉 $q.when(response) 并仅返回响应,则没有任何变化。
甚至在原始调用者收到 .error 之前就调用响应
感谢您的任何想法。希望我离解决方案不远了。
最佳答案
我遇到了同样的问题,就我而言,问题是我在响应中添加了 CORS header 作为后置过滤器,这意味着在发出 401 时它们不会被发送。
不确定您使用的服务器类型,但这是适合我的rails版本(将其更改为before_filter:
before_filter :allow_cors
def allow_cors
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, PUT, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = 'Accept, Cache-Control, Referer, User-Agent, Origin, X-Requested-With, X-Prototype-Version, Content-Type, accept, autho
headers['Access-Control-Allow-Credentials'] = 'true'
headers['Access-Control-Request-Method'] = '*'
headers['Access-Control-Max-Age'] = '1728000'
end
(显然这些是相当宽松的设置,因此请在生产中使用之前调整它们)
我设法找到这个问题的方法是使用 CURL 在本地测试请求,因此这可能会对您有所帮助:
curl -H "Origin: http://example.com" --verbose http://localhost:3000/
这样,即使请求未经授权,您也可以查看 header 是否正确返回。
关于Angularjs 在应用程序范围内处理 401 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24907306/