在主干上添加请求头
我的服务器有手动授权。 我需要把我的服务器的用户名/密码给我的骨干请求,以便它通过。 我怎么可以这样做? 有任何想法吗? 谢谢
Backbone中的模型使用fetch
, save
和destroy
方法来检索,更新和销毁数据。 这些方法委托实际的请求部分Backbone.sync。 所有的Backbone.sync
都在使用jQuery创build一个ajax请求。 为了结合你的基本HTTPauthentication,你有几个选项。
fetch
, save
和destroy
所有接受一个额外的参数[options]
。 这些[options]
只是一个jQuery请求选项的字典,它包含在jQuery ajax调用中。 这意味着您可以轻松定义一个附加authentication的简单方法:
sendAuthentication = function (xhr) { var user = "myusername";// your actual username var pass = "mypassword";// your actual password var token = user.concat(":", pass); xhr.setRequestHeader('Authorization', ("Basic ".concat(btoa(token)))); }
并将其包含在每个fetch
, save
和destroy
您所做的调用中。 像这样:
fetch({ beforeSend: sendAuthentication });
这可能会造成相当多的重复。 另一个select是覆盖Backbone.sync
方法,复制原始代码,并将beforeSend
选项包含在每个jQuery ajax请求中。
希望这可以帮助!
在Backbone.js中添加请求标头最简单的方法就是将它们作为parameter passing给获取方法,例如
MyCollection.fetch( { headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );
一个选项可能是使用jQuery ajaxSetup,所有的Backbone请求最终都会使用底层的jQuery ajax。 这种方法的好处是你只需要添加一个地方。
$.ajaxSetup({ headers: { 'Authorization' :'Basic USERNAME:PASSWORD' } });
您可以覆盖Backbone同步方法。
#coffeescript _sync = Backbone.sync Backbone.sync = (method, model, options) -> options.beforeSend = (xhr) -> xhr.setRequestHeader('X-Auth-Token_or_other_header' , your_hash_key) #make sure your server accepts X-Auth-Token_or_other_header!! #calling the original sync function so we only overriding what we need _sync.call( this, method, model, options )
Backbone.$.ajaxSetup({ headers: {'Authorization' :'Basic USERNAME:PASSWORD'} });
这段代码将标题设置为Backbone ajax,所以它们将与每个Backbone.sync一起发送。 您将能够在每次同步呼叫时不使用xhr.setRequestHeader来发送标题。
所以你不需要做MyCollection.fetch( { headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );
每次。 你可以做
MyCollection.fetch();
也许这是一种破解,但它适用于我的系统:)
Object.save( {'used': true} {headers: {'Access-Token': 'access_token'}} )
我这样的方法将覆盖同步方法,以便在请求之前添加标头。 在这个例子中,你可以看到我正在创build一个Backbone.AuthenticatedModel
,它是从Backbone.Model
扩展而来的。
这将影响所有方法(GET,POST,DELETE等)
Backbone.AuthenticatedModel = Backbone.Model.extend({ sync: function(method, collection, options){ options = options || {}; options.beforeSend = function (xhr) { var user = "myusername";// your actual username var pass = "mypassword";// your actual password var token = user.concat(":", pass); xhr.setRequestHeader('Authorization', ("Basic ".concat(btoa(token)))); }; return Backbone.Model.prototype.sync.apply(this, arguments); } });
然后,您必须从您创build的Backbone.AuthenticatedModel
简单地扩展需要进行身份validation的模型:
var Process = Backbone.AuthenticatedModel.extend({ url: '/api/process', });
-
在客户端,在任何服务器通信之前添加:
$.ajaxSetup({ xhrFields: { withCredentials: true }, async: true });
-
在服务器端添加这些头(PHP):
header('Access-Control-Allow-Origin: http://your-client-app-domain'); header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With"); header('Access-Control-Allow-Credentials: true');
创build一个自定义同步方法,拦截对Backbone.sync的调用,并将您的授权标头填入并传递其他所有内容:
REPORTING_API_KEY = 'secretKeyHere'; CustomSync = function(method, model, options) { options.headers = { 'Authorization' : 'Bearer ' + REPORTING_API_KEY }; return Backbone.sync(method, model, options); };
然后用这个覆盖你的模型的同步:
MyModel = Backbone.Model.extend({ urlRoot: '/api/', sync: CustomSync });