2011-10-16 19 views
28

Sto provando a creare un'applicazione mobile con PhoneGap, jQuery Mobile e Backbone.js sul lato client - con un'API JSON Rails 3 in esecuzione sul lato server.Come utilizzare l'autenticazione token con Rails, Devise e Backbone.js?

So come recuperare il token dal server dopo essere stato autenticato, ma non so come aggiungere la chiave/valore "token_auth" a tutte le richieste AJAX che Backbone.js farà al mio server.

Ecco il mio flusso in questo momento:

  1. Tipi di utente in alcuni campi del modulo e colpi "Login"
  2. Backbone crea un nuovo oggetto Player con informazioni e-mail e la password.
  3. Ho eseguito una Player.authenticate che imposta il token per AUTHENTICATION_TOKEN
  4. Tutte le richieste dopo questo dovrebbe aggiungere "auth_token =" + AUTHENTICATION_TOKEN

Ho guardato http://documentcloud.github.com/backbone/#Sync forse per l'override del chiamate AJAX - ma sembra abbastanza estremo per questo semplice compito.

Qualcuno ha esperienza con l'esecuzione di token_authentication e Backbone.js?

risposta

14

Perché non aggiungerlo a tutte le richieste jjery javery. Aggiungerà auth_token a tutte le tue chiamate ajax su jQuery. Ciò potrebbe essere utile quando si lavora direttamente con jQuery ajax (o libs che lo fanno). Ma potrebbe trattarsi anche di un problema di sicurezza (quando hai chiamate ajax ad altri siti ...).

// 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); 

    } 
}}); 

altro approccio potrebbe essere quello di scrivere che gettone nella intestazione ed elaborare sul lato server:

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

Mi piace molto questo approccio! È descrittivo e più vicino a quello che sto cercando di ottenere! Grazie :) – theodorton

+1

Sì, l'approccio è più pulito. Tuttavia, non è necessario analizzare e stringere i dati, il token di autenticazione può essere inviato utilizzando le intestazioni HTTP. Inoltre, non è necessario per le richieste GET. Ho aggiornato la demo: http://jsfiddle.net/dira/ZcY3D/18/ – dira

+0

solo per il futuro: è in grado di autenticare attraverso i campi di intestazione http personalizzati una funzione di elaborazione o è la convenzione di rails per elencarli sul controller # params? – abstraktor

26

La chiave è quello di introdurre nel metodo Backbone.sync.

Date un'occhiata a questa implementazione: https://github.com/codebrew/backbone-rails/blob/master/vendor/assets/javascripts/backbone_rails_sync.js

È possibile aggiungere voi stessi in questo modo:

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); 
}; 

Partenza questo violino: http://jsfiddle.net/dira/ZcY3D/14/

+0

Questo è un modo programmatico per risolvere il problema, ma mi piace il codice che è un po 'più vicino a una "soluzione" testuale per il problema. Comunque, suppongo :) – theodorton

+1

Semplicemente non torniamo a guardare questa domanda - e il motivo per cui questa risposta non è contrassegnata come accettata è perché utilizza il token CSRF. Sebbene si possa semplicemente cambiare la linea 'var token =' per farlo funzionare con qualsiasi altra variabile. – theodorton

+1

non dimenticare di restituire old_sync "return Backbone.old_sync (method, model, new_options);" per mantenere la catena ed evitare problemi su nuove versioni di backbone. – panchicore

1

Creare una funzione come questa, che lo invierà ogni volta che viene inviata una richiesta Ajax al server

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