ruby on rails - ¿Cómo se usa la autenticación de tokens con Rails, Devise y Backbone.js?
ruby-on-rails authentication (3)
¿Por qué no agregarlo a todas sus solicitudes jquery ajax? Agregará auth_token a todas sus llamadas ajax a través de jQuery. Eso podría ser útil cuando se trabaja directamente con jQuery ajax (o libs que lo hacen). Pero esto también podría ser un problema de seguridad (cuando tienes llamadas ajax a otros sitios ...).
// 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);
}
}});
Otro enfoque puede ser escribir ese token en el encabezado y procesarlo en el lado del servidor:
// thats not beautiful
$.ajaxSetup({ headers : { "auth_token" : AUTHENTICATION_TOKEN } });
Intento crear una aplicación móvil con PhoneGap, jQuery Mobile y Backbone.js en el lado del cliente, con una API Rails 3 JSON ejecutándose en el servidor.
Sé cómo recuperar el token del servidor después de ser autenticado, pero no sé cómo anexar la clave / valor "token_auth" a todas las solicitudes AJAX que Backbone.js realizará en mi servidor.
Aquí está mi flujo en este momento:
- El usuario escribe en algunos campos de formulario y acierta "Iniciar sesión"
- Backbone crea un nuevo objeto Player con la información de correo electrónico y contraseña.
- Ejecuto un Player.authenticate que establece el token en AUTHENTICATION_TOKEN
- Todas las solicitudes posteriores a esto deben agregar "auth_token =" + AUTHENTICATION_TOKEN
He visto http://documentcloud.github.com/backbone/#Sync para anular las llamadas AJAX, pero parece bastante extremo para esta simple tarea.
¿Alguien tiene alguna experiencia con la ejecución de Devise token_authentication y Backbone.js?
Cree una función como esta que lo enviará cada vez que se envíe una solicitud ajax al servidor
$(function(){
$(document).ajaxSend(function(e, xhr, options) {
var token = $("meta[name=''csrf-token'']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", token);
});
})
La clave es introducirlo en el método Backbone.sync
.
Eche un vistazo a esta implementación: https://github.com/codebrew/backbone-rails/blob/master/vendor/assets/javascripts/backbone_rails_sync.js
Puede agregarlo usted mismo de esta manera:
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);
};
Mira este violín: http://jsfiddle.net/dira/ZcY3D/14/