53

我的服务器有手动授权。我需要将我的服务器的用户名/密码放到我的主干请求中才能通过。我该怎么做?有任何想法吗?谢谢

4

10 回答 10

56

fetchBackbone 中的模型使用方法、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 请求中。

希望这可以帮助!

于 2012-04-10T03:17:16.863 回答
43

在 Backbone.js 中添加请求标头的最简单方法是将它们作为参数传递给 fetch 方法,例如

MyCollection.fetch( { headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );
于 2012-08-07T12:35:10.373 回答
30

一种选择可能是使用 jQuery ajaxSetup,所有 Backbone 请求最终都将使用底层的 jQuery ajax。这种方法的好处是您只需将其添加到一个位置。

$.ajaxSetup({
    headers: { 'Authorization' :'Basic USERNAME:PASSWORD' }
});

编辑 2018 年 1 月 2 日 对于复杂的 Web 应用程序,这可能不是最好的方法,请参阅下面的评论。在这里留下答案以供参考。

于 2013-12-17T11:49:37.583 回答
18

您可以覆盖主干同步方法。

#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 )       
于 2013-11-29T08:18:44.043 回答
11
Backbone.$.ajaxSetup({
    headers: {'Authorization' :'Basic USERNAME:PASSWORD'}
});

此代码将标头设置为 Backbone ajax,因此它们将与每个 Backbone.sync 一起发送。您将能够在不使用xhr.setRequestHeader每个同步调用的情况下发送标头。

因此,您无需每次都执行以下操作:

MyCollection.fetch({ headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );

你可以做

MyCollection.fetch();

也许这是一种 hack,但它非常适合我的系统。

于 2015-06-04T22:14:51.443 回答
6

我对此类事情的处理方法是覆盖同步方法,以便在执行请求之前添加标头。在示例中,您可以看到我正在创建一个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',

});
于 2015-08-11T20:54:03.843 回答
4
Object.save(
  {'used': true}
  {headers: {'Access-Token': 'access_token'}}
)
于 2012-08-23T15:59:26.677 回答
2

创建一个自定义同步方法,该方法拦截对 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
    });
于 2017-02-13T21:29:04.750 回答
1

尝试使用它。我们可以使用

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');
    }
});
于 2019-03-21T13:58:58.853 回答
-1
  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');
    
于 2017-01-29T22:20:29.227 回答