2013-06-04 105 views
5

我编写了以下控制器,用于使用Angular JS测试HTTP基本身份验证。无法在AngularJS中设置HTTP基本身份验证标头

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)。但是,当我使用Chrome Developer Toolbar或Firefox中的Firebug检查请求标题时,我看不到授权标头。

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

我在做什么错在这里?

+1

您无法使用JSONP自定义标头。见http://stackoverflow.com/questions/3073287/set-headers-with-jquery-ajax-and-jsonp –

+0

谢谢..猜猜我应该使用get或post然后。 – Manu

回答

4

我相信答案是“是的,对于常规的AJAX请求,您应该可以设置正确的auth头文件”

但是,当您使用JSONP(基于示例)时,您不会进行标准XHR呼叫,会将答案更改为“否”

如果你使用JSONP卡住了,我认为你不能发送任何auth头文件。例如,JSONP根本不像Angular的$http.get一样工作。

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

1

JJ回答完美。

有关浏览的更多信息,如果您只需要传递基本授权标头,则只需在URL的开头放置用户名和密码即可。这将发送标题。

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

http://localhost:5000 

到:

http://admin:[email protected]:5000 

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

+0

为什么要投票? – eclipse1121

+0

在浏览器的地址栏中尝试了这个,但它只给出了一个错误。这可能是JS库的一个特性?也许downvote是缺乏细节以及可能不是最佳做法,但它是一个有趣的功能要知道。 – user1944491

+0

感谢您的评论。这里的[例子](http://i.imgur.com/l0os1pJ.png)介绍了如何使用基本身份验证的Stripe API来完成它。可能需要的是所请求的URL需要返回基本身份验证标题以及401未授权标头,但我不确定 – eclipse1121