Добавить заголовок запроса на магистраль - программирование
Подтвердить что ты не робот

Добавить заголовок запроса на магистраль

У моего сервера есть авторизация вручную. Мне нужно указать имя пользователя/пароль моего сервера на мой основной запрос, чтобы он прошел. Как я могу это сделать? Есть идеи? Спасибо вам

4b9b3361

Ответ 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');