web-dev-qa-db-ja.com

バックボーンにリクエストヘッダーを追加する

私のサーバーには手動認証があります。サーバーが通過するには、サーバーのユーザー名/パスワードをバックボーン要求に入れる必要があります。どうすればいいですか?何か案は?ありがとうございました

50
jongbanaag

バックボーンのモデルは、メソッドfetchsave、およびdestroyを使用してデータを取得、更新、および破棄します。これらのメソッドは、実際の要求部分をBackbone.syncに委任します。内部では、Backbone.syncが実行しているのは、jQueryを使用してajaxリクエストを作成することだけです。基本HTTP認証を組み込むには、いくつかのオプションがあります。

fetchsave、および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))));
}

そして、各fetchsave、およびdestroy呼び出しに含めます。そのようです:

 fetch({
  beforeSend: sendAuthentication 
 });

これにより、かなりの繰り返しが発生する可能性があります。別のオプションは、Backbone.syncメソッドをオーバーライドし、元のコードをコピーして、作成される各jQuery ajaxリクエストにbeforeSendオプションを含めるだけです。

お役に立てれば!

54
shanewwarren

Backbone.jsにリクエストヘッダーを追加する最も簡単な方法は、パラメーターとしてfetchメソッドに渡すだけです。

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

1つのオプションは、jQuery ajaxSetupを使用することです。すべてのBackboneリクエストは、最終的に基礎となるjQuery ajaxを使用します。このアプローチの利点は、1箇所追加するだけで済むことです。

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

2018年1月2日編集複雑なWebアプリケーションの場合、これは最善のアプローチではない可能性があります。以下のコメントを参照してください。参考のためにここに答えを残します。

29
Andy Polhill

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 )       
18
zzart
Backbone.$.ajaxSetup({
    headers: {'Authorization' :'Basic USERNAME:PASSWORD'}
});

このコードはヘッダーをBackbone ajaxに設定するため、すべてのBackbone.syncで送信されます。すべての同期呼び出しでxhr.setRequestHeaderを使用せずにヘッダーを送信できます。

そのため、毎回次の作業を行う必要はありません。

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

あなたはできる

MyCollection.fetch();

たぶんそれは一種のハックですが、私のシステムには完全に機能します。

11
Roman Paraschak

このようなものへの私のアプローチは、リクエストを行う前にヘッダーを追加するために同期メソッドを上書きすることです。この例では、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',

});
6
sebastian-greco
Object.save(
  {'used': true}
  {headers: {'Access-Token': 'access_token'}}
)
4

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
    });
2
ehed

それを使用してみてください。どちらでも使用できます

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');
    }
});
1
Umar Asghar