私のサーバーには手動認証があります。サーバーが通過するには、サーバーのユーザー名/パスワードをバックボーン要求に入れる必要があります。どうすればいいですか?何か案は?ありがとうございました
バックボーンのモデルは、メソッドfetch
、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
メソッドをオーバーライドし、元のコードをコピーして、作成される各jQuery ajaxリクエストにbeforeSend
オプションを含めるだけです。
お役に立てれば!
Backbone.jsにリクエストヘッダーを追加する最も簡単な方法は、パラメーターとしてfetchメソッドに渡すだけです。
MyCollection.fetch( { headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );
1つのオプションは、jQuery ajaxSetupを使用することです。すべてのBackboneリクエストは、最終的に基礎となるjQuery ajaxを使用します。このアプローチの利点は、1箇所追加するだけで済むことです。
$.ajaxSetup({
headers: { 'Authorization' :'Basic USERNAME:PASSWORD' }
});
2018年1月2日編集複雑なWebアプリケーションの場合、これは最善のアプローチではない可能性があります。以下のコメントを参照してください。参考のためにここに答えを残します。
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();
たぶんそれは一種のハックですが、私のシステムには完全に機能します。
このようなものへの私のアプローチは、リクエストを行う前にヘッダーを追加するために同期メソッドを上書きすることです。この例では、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');
}
});