我的服务器有手动授权。我需要将我的服务器的用户名/密码放到我的主干请求中才能通过。我该怎么做?有任何想法吗?谢谢
10 回答
fetch
Backbone 中的模型使用方法、save
和来检索、更新和销毁数据destroy
。这些方法将实际请求部分委托给 Backbone.sync。在后台,Backbone.sync
所做的只是使用 jQuery 创建一个 ajax 请求。为了合并您的基本 HTTP 身份验证,您有几个选项。
fetch
, save
, 并且destroy
都接受一个附加参数[options]
。这些[options]
只是一个包含在 jQuery ajax 调用中的 jQuery 请求选项字典。这意味着您可以轻松定义一个附加身份验证的简单方法:
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
});
这会造成相当多的重复。另一种选择可能是覆盖该Backbone.sync
方法,复制原始代码并将该beforeSend
选项包含在每个 jQuery ajax 请求中。
希望这可以帮助!
在 Backbone.js 中添加请求标头的最简单方法是将它们作为参数传递给 fetch 方法,例如
MyCollection.fetch( { headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );
一种选择可能是使用 jQuery ajaxSetup,所有 Backbone 请求最终都将使用底层的 jQuery ajax。这种方法的好处是您只需将其添加到一个位置。
$.ajaxSetup({
headers: { 'Authorization' :'Basic USERNAME:PASSWORD' }
});
编辑 2018 年 1 月 2 日 对于复杂的 Web 应用程序,这可能不是最好的方法,请参阅下面的评论。在这里留下答案以供参考。
您可以覆盖主干同步方法。
#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();
也许这是一种 hack,但它非常适合我的系统。
我对此类事情的处理方法是覆盖同步方法,以便在执行请求之前添加标头。在示例中,您可以看到我正在创建一个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);
}
});
Backbone.AuthenticatedModel
然后,您必须从您创建的模型中简单地扩展您需要进行身份验证的模型:
var Process = Backbone.AuthenticatedModel.extend({
url: '/api/process',
});
Object.save(
{'used': true}
{headers: {'Access-Token': 'access_token'}}
)
创建一个自定义同步方法,该方法拦截对 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
});
尝试使用它。我们可以使用
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRFToken', csrf_token);
},
或者
headers: {
"X-CSRFToken": csrf_token
},
但我会推荐第一个选项(beforeSend)。
这是我的工作代码片段。
var csrf_token = this.getCSRFToken();
self.collection.fetch(
{
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRFToken', csrf_token);
},
// headers: {
// "X-CSRFToken": csrf_token
// },
data: {
"mark_as": "read"
},
type: 'POST',
success: function () {
if (clickLink) {
window.location.href = clickLink;
} else {
self.unreadNotificationsClicked(e);
// fetch the latest notification count
self.counter_icon_view.refresh();
}
},
error: function(){
alert('erorr');
}
});
在客户端,在任何服务器通信之前添加:
$.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');