我是backbone.js的新手。我用php构建了一个rest api,我想用backbone.js连接到它。我正在通过我的其他api用于身份验证的http基本身份验证时遇到了困难。
我可以使用命令行中的curl轻松访问我的rest api,如下所示
curl -u username:password -X GET http://api.mysite.com/user
但是当我尝试进行提取时(这几乎就是我想要做的)我从我的其他api得到一个响应,认证失败。
这是来自backbone.js的电话
user.fetch({headers:{'Authorization':'Basic username:password'}});
使用backbone.js我会收到基本身份验证失败时的预期响应。我的问题是,因为我知道我的休息api与curl进行身份验证,为什么不通过上面的javascript进行身份验证呢?
另外,当我查看js控制台中发送的标题时,我看不到任何有关授权的信息。
更新
我尝试了下面评论中列出的插件,但得到了相同的结果
这是我的代码
var User=Backbone.Model.extend({
url: 'http://api.mysite.com/user'
});
var user=new User();
user.credentials = {
username: 'username',
password: 'password'
};
user.fetch();
答案 0 :(得分:3)
用户名和密码在发送之前需要使用Baes64进行编码。
执行此操作的一种简单方法(至少用于测试)是配置所有jQuery ajax请求以发送信息(Backbone使用jQuery进行ajax调用):
$.ajaxSetup(
beforeSend: function(xhr){
xhr.setRequestHeader("Authorization", "Basic " + btoa("USERNAME" + ":" + "PASSWORD"));
}
);
请注意,btoa
是使用Base64对params进行编码的函数。现在你可以调用user.fetch()
并且它应该正常工作:你不需要提供凭据,因为我们已经配置了jQuery来为我们发送它们(所有时间)。
当然,根据您的情况(例如,使用多个API),您可能更愿意在每个请求中指定beforeSend
属性,或者在Backbone sync
函数中定义它。
答案 1 :(得分:0)
我在允许的标题列表中添加了“授权”,这就行了。
header("Access-Control-Allow-Headers: Authorization, Origin, X-Requested-With, Content-Type, Accept");