Angularjs 在应用程序范围内处理 401 错误

标签 angularjs access-token http-status-code-401 jwt

我在处理应用程序范围内的 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/

相关文章:

access-token - Google plus 的 access_token 集成

oauth-2.0 - 在 linkedin developer 中创建应用程序时没有在 OAuth 2.0 范围中添加任何权限

javascript - Google Javascript API 401 Fusion Table 凭证无效

iis-7.5 - HTTP 错误 401.2 - 未经授权 由于身份验证 header 无效,您无权查看此页面

java - Java HttpURLConnection.getInputStream但获得401 IOException

angularjs - 期待 spy 但未定义?

angularjs - 如何使用 Sinon 测试在 promise 中设置的 AngularJS Controller 值

javascript - 使用 firebase 动态更改 img ng-repeat

oauth-2.0 - 如何保护刷新 token ?

javascript - HighCharts图表导出(截图下载)不显示Navigator图