5

我编写了以下控制器,用于使用 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;
     });
}

我可以看到在 i 时设置了标题console.log($http.defaults.headers)。但是,当我在 Firefox 中使用 Chrome 开发人员工具栏或 Firebug 检查请求标头时,我看不到授权标头。

接收请求的服务器没有获得 Authorization 标头。

我在这里做错了什么?

4

2 回答 2

4

我相信答案是“是的,对于常规的 AJAX 请求,您应该能够设置正确的身份验证标头”

但是,当您使用 JSONP(基于示例)时,您并没有进行标准的 XHR 调用,这会将答案更改为 "No"

如果您无法使用 JSONP,我认为您无法发送任何身份验证标头。例如,JSONP 的工作方式与 Angular 的工作方式不同$http.get

有关详细信息,请参阅http://schock.net/articles/2013/02/05/how-jsonp-really-works-examples/,但简短的版本是 JSONP 放置一个<script>获取一些数据的标签。JSON_CALLBACK返回的数据围绕服务器提供的数据调用您提供的函数(在您的示例中)。因此,您无法更改标头——该请求是一个 HTTP GET 请求,就像您将脚本标记的 URL 粘贴到浏览器的地址栏中一样。

于 2013-10-29T19:06:20.527 回答
1

JJ完美地回答了它。

对于那些浏览的更多信息,如果您只需要传递基本授权标头,您只需在 URL 的开头放置一个用户名和密码。这将发送标题。

例如,使用 localhost 作为 URL 和 admin:secret 作为用户名:密码,更改:

http://localhost:5000

至:

http://admin:secret@localhost:5000

注意: @OliBlogger 已指出最新版本的 Chrome 不再支持此功能。查看他的评论以获取实际 Chrome 状态更新的链接。

于 2015-01-03T04:35:18.227 回答