Arhn - архитектура программирования

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

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

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

Вот мой поток на данный момент:

  1. Пользователь вводит данные в некоторые поля формы и нажимает «Войти».
  2. Backbone создает новый объект Player с информацией об электронной почте и пароле.
  3. Я запускаю Player.authenticate, который устанавливает токен в AUTHENTICATION_TOKEN.
  4. Все запросы после этого должны добавлять "auth_token=" + AUTHENTICATION_TOKEN

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

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


Ответы:


1

Почему бы не добавить его ко всем вашим запросам jquery ajax. Он добавит auth_token ко всем вашим вызовам ajax через jQuery. Это может быть полезно при работе напрямую с jQuery ajax (или библиотеками, которые это делают). Но это также может быть проблемой безопасности (когда у вас есть 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 } });
17.10.2011
  • Мне очень нравится этот подход! Это описательно и ближе к тому, чего я пытаюсь достичь! Спасибо:) 19.10.2011
  • Да, подход чище. Однако нет необходимости анализировать и упорядочивать данные, токен аутентификации можно отправить с помощью заголовков HTTP. Кроме того, это не требуется для запросов GET. Я обновил демо: jsfiddle.net/dira/ZcY3D/18 20.10.2011
  • только на будущее: возможность аутентификации через настраиваемые поля заголовков http является функцией разработки или это рельсовое соглашение, чтобы перечислить их в параметрах контроллера #? 21.10.2011
  • Токен аутентификации в этом конкретном примере потребуется для ЛЮБОГО запроса к серверу. Я не думаю, что аутентификация через настраиваемые поля заголовков http - это функция в разработке. 22.02.2012
  • Следует использовать подход заголовка, но, пожалуйста, используйте правильную спецификацию токена носителя: tools.ietf.org/html/draft-ietf-oauth-v2-bearer-18 Вот пример заголовка: GET /resource HTTP/1.1 Хост: server.example.com Авторизация: Bearer mF_9 .B5f-4.1JqM PS: Извините за форматирование - это действительно самое раздражающее окно редактирования. 16.03.2012
  • $.ajaxSetup(), похоже, не включает заголовок для не-ajax-вызовов, которые магистраль делает на сервер. Например, если вы перезагружаете документ (который не является ajax), заголовок не включается. 18.08.2014

  • 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/

    19.10.2011
  • Это хороший программный способ решения проблемы, но мне нравится код, который ближе к текстовому решению проблемы. Хотя это сработает, я думаю :) 19.10.2011
  • Просто не вернулся, чтобы посмотреть на этот вопрос, и причина, по которой этот ответ не помечен как принятый, заключается в том, что он использует токен CSRF. Хотя можно просто изменить строку var token =, чтобы она работала с любой другой переменной. 22.02.2012
  • не забудьте вернуть old_sync return Backbone.old_sync(method, model, new_options); чтобы сохранить цепочку и избежать проблем с новыми версиями магистрали. 17.08.2013

  • 3

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

    $(function(){
        $(document).ajaxSend(function(e, xhr, options) {
            var token = $("meta[name='csrf-token']").attr("content");
            xhr.setRequestHeader("X-CSRF-Token", token);
        });
    })
    
    17.09.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..