9

Recentemente sono passato alla chiusura di Google per un nuovo progetto. Ho difficoltà ad aggiungere il token di autenticità alle intestazioni in una chiamata Ajax. Come faccio a farlo?Come aggiungo il token di autenticità?

mio frammento di Ajax (utilizzando la classe goog.net.XhrIo):

var initialHTMLContent = superField[i].getCleanContents(); 

var data = goog.Uri.QueryData.createFromMap(new goog.structs.Map({ 
    body: initialHTMLContent 
})); 

goog.net.XhrIo.send('/blogs/create', function(e) { 
    var xhr = /** @type {goog.net.XhrIo} */ (e.target); 
    alert(xhr.getResponseXml()); 
}, 'POST', data.toString(), { 
    'Accept' : 'text/xml' 
      }); 

Utilizzando rotaie nel backend.

UPDATE:

Log:

Processing BlogsController#create (for 127.0.0.1 at 2010-06-29 20:18:46) [PUT] 
    Parameters: {"authenticity_token"=>""} 

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): 


Rendered rescues/_trace (272.4ms) 
Rendered rescues/_request_and_response (1.2ms) 
Rendering rescues/layout (unprocessable_entity) 

risposta

15

Da qualche parte in una vista rotaie (file .html.erb) è possibile impostare una variabile js come questo:

window._token = '<%= form_authenticity_token %>'; 

E quindi aggiungilo nella tua chiamata:

goog.net.XhrIo.send('/blogs/create?authenticity_token=' + window._token, function(e) { 
    var xhr = /** @type {goog.net.XhrIo} */ (e.target); 
    alert(xhr.getResponseXml()); 
}, 'POST', data.toString(), { 
    'Accept' : 'text/xml' 
      }); 
+0

ottengo un '# '. Forse non sta prendendo in considerazione il token auth? Ho aggiornato la mia domanda con il registro. –

+0

Ho aggiornato la risposta di conseguenza. Sembra che tu abbia questa chiamata in un semplice file javascript. È necessario generare il token sul server, quindi è necessario farlo in una vista. –

+0

Ho aggiornato la mia domanda. Non sta prendendo in considerazione il token auth in questo modo. –

2

Rails ora aggiunge automaticamente un meta tag per esso, così poi nella tua pagina javascript è possibile utilizzare:

token = $('meta[name="csrf-token"]').attr('content')