У моего сервера есть авторизация вручную. Мне нужно указать имя пользователя/пароль моего сервера на мой основной запрос, чтобы он прошел. Как я могу это сделать? Есть идеи? Спасибо вам
Добавить заголовок запроса на магистраль
Ответ 1
Модели в Backbone извлекают, обновляют и уничтожают данные с помощью методов fetch
, save
и destroy
. Эти методы делегируют фактическую часть запроса на Backbone.sync. Под капотом все Backbone.sync
делает это, создавая запрос ajax, используя jQuery. Чтобы включить базовую HTTP-аутентификацию, у вас есть несколько вариантов.
fetch
, save
и destroy
все принимают дополнительный параметр [options]
. Эти [options]
- это просто словарь параметров запроса jQuery, которые включаются в jQuery ajax-вызов, который выполняется. Это означает, что вы можете легко определить простой метод, который добавляет аутентификацию:
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.
Надеюсь, это поможет!
Ответ 2
Самый простой способ добавить заголовок запроса в Backbone.js - просто передать их методу выборки в качестве параметров, например.
MyCollection.fetch( { headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );
Ответ 3
Одним из вариантов может быть использование jQuery ajaxSetup, все запросы Backbone в конечном итоге будут использовать базовый jQuery ajax. Преимущество этого подхода состоит в том, что вам нужно добавить только одно место.
$.ajaxSetup({
headers: { 'Authorization' :'Basic USERNAME:PASSWORD' }
});
Ответ 4
Вы можете переопределить метод базовой линии.
#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 )
Ответ 5
Backbone.$.ajaxSetup({
headers: {'Authorization' :'Basic USERNAME:PASSWORD'}
});
Этот код устанавливает заголовки в Backbone ajax, поэтому они будут отправляться с каждым Backbone.sync. Вы можете отправлять заголовки без использования xhr.setRequestHeader
с каждым вызовом синхронизации.
Поэтому вам не нужно делать следующее каждый раз:
MyCollection.fetch({ headers: {'Authorization' :'Basic USERNAME:PASSWORD'} } );
Вы можете просто сделать
MyCollection.fetch();
Возможно, это взломать, но он отлично работает для моей системы.
Ответ 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',
});
Ответ 7
Object.save(
{'used': true}
{headers: {'Access-Token': 'access_token'}}
)
Ответ 8
Создайте собственный метод синхронизации, который перехватывает вызовы 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
});
Ответ 9
-
На стороне клиента добавьте это перед любой связью сервера:
$.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');