$ http get request总是返回401未经授权 - 不发送auth头

时间:2017-02-18 22:43:16

标签: javascript angularjs http authentication http-headers

我在angularjs中使用以下控制器



app.controller('download-posts-controller', function($scope, $http) {
    $http.get('http://localhost:8090/posts', {
        headers: {
            'Authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJQYXNjYWwiLCJ1c2VySWQiOiIxMjMiLCJyb2xlIjoiYWRtaW4ifQ.4D9TUDQAgIWAooyiMN1lV8Y5wVCrIF4rAeGzFzelSE9diqHMik9WE9x4EsNnEcxQXYATjxAZovpp-m72LpFADA'
        }
      }).success(function(response){
        window.alert(response)
    });
});




它应该只使用GET请求调用我的API,在标头中发送授权令牌以验证服务器上的请求。

我未经授权收到401。我的API层启用了CORS,因此不应该成为问题。

在浏览器检查中,我发现由于某种原因,它似乎无论如何都要发出OPTIONS请求,并且也不会在标头中发送身份验证令牌。

任何想法我做错了什么? 我是angularjs的新手

2 个答案:

答案 0 :(得分:-1)

务必设置凭据模式:

app.controller('download-posts-controller', function($scope, $http) {
    $http.get('http://localhost:8090/posts', {
        headers: {
            //USE credentials mode
            withCredentials: true,
            'Authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJQYXNjYWwiLCJ1c2VySWQiOiIxMjMiLCJyb2xlIjoiYWRtaW4ifQ.4D9TUDQAgIWAooyiMN1lV8Y5wVCrIF4rAeGzFzelSE9diqHMik9WE9x4EsNnEcxQXYATjxAZovpp-m72LpFADA'
        }
      //SUCCESS is deprecated, removed from v1.6
      //}).success(function(response){
      }).then(function(response) {
        window.alert(response)
    });
});

有关详细信息,请参阅AngularJS $http Service API Reference - Usage

  

这看起来很有希望,但它仍然返回401并且根据我的浏览器,请求中没有标题。它总是说请求方法也是OPTIONS

来自浏览器的OPTIONS请求是pre-flight request.

CORS中,发送带有OPTIONS方法的预检请求,以便服务器可以响应发送请求是否可接受。 Access-Control-Request-Method标头作为预检请求的一部分通知服务器,当发送实际请求时,它将使用指定的请求方法发送。 Access-Control-Request-Headers标头通知服务器,当发送实际请求时,它将与指定的标头一起发送。然后,服务器有机会确定是否希望在这种情况下接受请求。

服务器以Access-Control-Allow-Methods响应,指定查询相关资源的可行方法。

Same Origin Policy阻止恶意网站使用用户的位置和凭据来做恶。 pre-flight requests允许服务器允许浏览器在这些请求无害时放宽该策略。

答案 1 :(得分:-1)

好的,我最终发现跨源(CORS)请求首先发送OPTIONS请求以确保允许用户请求。 现在......我的api后端有一些逻辑过滤掉所有传入的HTTP并检查是否存在包含令牌的授权头(在所有情况下除非uri包含'/ auth / **')。当执行初始OPTIONS请求时,我提供的auth头中的令牌不会被包含,因为浏览器首先等待,直到OPTIONS回来说我可以发出此请求......因此抛出异常在服务器上,因为OPTIONS请求未使用令牌进行验证。

修复...我只是检查“OPTIONS”HTTP方法并在这种情况下忽略auth。简单。 感谢anybodies帮助尝试解决这个问题。最后它只需要大量的调试。

我希望这可能有助于指导至少另一个遇到类似问题的人。