Подтвердить что ты не робот

Как использовать аутентификацию на токенах с помощью Rails, Devise и Backbone.js?

Я пытаюсь создать мобильное приложение с помощью PhoneGap, jQuery Mobile и Backbone.js на стороне клиента - с API-интерфейсом Rails 3 JSON, работающим на стороне сервера.

Я знаю, как извлечь маркер с сервера после проверки подлинности, но я не знаю, как добавить ключ/значение token_auth ко всем запросам AJAX, которые Backbone.js сделает на моем сервере.

Здесь мой поток в данный момент:

  • Типы пользователей в некоторых формах и хитах "Войти"
  • Backbone создает новый объект Player с информацией по электронной почте и паролю.
  • Я запускаю Player.authenticate, который устанавливает токен в AUTHENTICATION_TOKEN
  • Все запросы после этого должны добавить "auth_token =" + AUTHENTICATION_TOKEN

Я рассмотрел http://documentcloud.github.com/backbone/#Sync, возможно, переопределив вызовы AJAX, но для этой простой задачи это выглядит довольно экстремально.

Есть ли у кого-нибудь опыт работы с deves token_authentication и Backbone.js?

4b9b3361

Ответ 1

Почему бы не добавить его ко всем вашим запросам jQuery ajax. Он добавит auth_token ко всем вашим вызовам ajax через jQuery. Это может быть полезно при работе непосредственно с jQuery ajax (или libs, которые делают это). Но это может быть проблемой безопасности (когда у вас есть ajax-вызовы на другие сайты...).

// this is untested
$.ajaxSetup({ beforeSend : function(xhr, settings){ 

  // just because the auth_token is a private information
  if(!settings.crossDomain) {

    // parse data object
    var dataobj = JSON.parse(xhr.data);

    // add authentication token to the data object
    dataobj.auth_token = AUTHENTICATION_TOKEN;

    // save the dataobject into the jqXHR object
    xhr.data = JSON.stringify(dataobj); 

  }
}});

Другой подход может заключаться в том, чтобы записать этот токен в заголовок и обработать его на стороне сервера:

// thats not beautiful
$.ajaxSetup({ headers : { "auth_token" : AUTHENTICATION_TOKEN } });

Ответ 2

Ключ должен ввести его в метод Backbone.sync.

Взгляните на эту реализацию: https://github.com/codebrew/backbone-rails/blob/master/vendor/assets/javascripts/backbone_rails_sync.js

Вы можете добавить это следующим образом:

Backbone.old_sync = Backbone.sync
Backbone.sync = function(method, model, options) {
    var new_options =  _.extend({
        beforeSend: function(xhr) {
            var token = $('meta[name="csrf-token"]').attr('content');
            if (token) xhr.setRequestHeader('X-CSRF-Token', token);
        }
    }, options)
    return Backbone.old_sync(method, model, new_options);
};

Посмотрите эту скрипту: http://jsfiddle.net/dira/ZcY3D/14/

Ответ 3

Создайте такую ​​функцию, которая будет отправлять ее в любое время, когда запрос ajax отправляется на сервер

$(function(){
    $(document).ajaxSend(function(e, xhr, options) {
        var token = $("meta[name='csrf-token']").attr("content");
        xhr.setRequestHeader("X-CSRF-Token", token);
    });
})