我在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的新手
答案 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帮助尝试解决这个问题。最后它只需要大量的调试。
我希望这可能有助于指导至少另一个遇到类似问题的人。