Как использовать аутентификацию на токенах с помощью 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?
Ответы
Ответ 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);
});
})