我编写了以下控制器,用于使用Angular JS测试HTTP Basic Auth。
function TestCtrl($scope, $http, Base64){
$http.defaults.headers.common.Authorization = 'Basic ' + Base64.encode('admin:secret');
$http.jsonp( 'http://localhost:5000/test'+'/?callback=JSON_CALLBACK', {query:{isArray:true }}).
then(function (response) {
$scope.test = response.data;
});
}
我可以看到在console.log($http.defaults.headers)
时设置的标头。但是,当我在Firefox中使用Chrome开发者工具栏或Firebug检查请求标头时,我看不到授权标头。
接收请求的服务器未获得Authorization标头。
我在这里做错了什么?
答案 0 :(得分:4)
我相信答案是“是的,对于常规的AJAX请求,您应该能够设置正确的auth标头”。
但是,当您使用JSONP(基于示例)时,您没有进行标准的XHR调用,会将答案更改为“否”。
如果您使用JSONP,我认为您不能发送任何身份验证标头。例如,JSONP与Angular的$http.get
的工作方式不同。
有关详细信息,请参阅http://schock.net/articles/2013/02/05/how-jsonp-really-works-examples/,但简短版本是JSONP,它会记下一个用于获取某些数据的<script>
标记。返回的数据会调用您在服务器提供的数据周围提供的函数(示例中为JSON_CALLBACK
)。因此,您无法更改标头 - 请求是HTTP GET请求,就像您将脚本标记的URL粘贴到浏览器的位置栏一样。
答案 1 :(得分:1)
有关浏览的详细信息,如果您只需要传递基本授权标头,则只需在URL的开头放置用户名和密码即可。这将发送标题。
例如,使用localhost作为URL,使用admin:secret作为用户名:password,更改:
http://localhost:5000
为:
http://admin:secret@localhost:5000
注意: @OliBlogger指出最新版本的Chrome不再支持此功能。查看他的评论,获取实际Chrome状态更新的链接。