在主干上添加请求头

我的服务器有手动授权。 我需要把我的服务器的用户名/密码给我的骨干请求,以便它通过。 我怎么可以这样做? 有任何想法吗? 谢谢

Backbone中的模型使用fetchsavedestroy方法来检索,更新和销毁数据。 这些方法委托实际的请求部分Backbone.sync。 所有的Backbone.sync都在使用jQuery创build一个ajax请求。 为了结合你的基本HTTPauthentication,你有几个选项。

fetchsavedestroy所有接受一个额外的参数[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)))); } 

并将其包含在每个fetchsavedestroy您所做的调用中。 像这样:

  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', }); 
  1. 在客户端,在任何服务器通信之前添加:

     $.ajaxSetup({ xhrFields: { withCredentials: true }, async: true }); 
  2. 在服务器端添加这些头(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 });