2012-05-02 13 views
8

Ho giocato con l'utilizzo di rest-client per accedere a un'app di rails che ho scritto. Ho scritto uno script veloce per accedere e fare una richiesta di post. Tutto funziona, ma ho dovuto aggirare il fatto che non viene fornito nessun autenticità_token se si fa una richiesta per un modulo in json. Ho dovuto fare una richiesta html regolare in altri ottenere il authenticity_token e quindi incluso questo nel json che ho inviato come parte della mia richiesta di post. Fondamentalmente ho un uno script rapido sporca come quella qui sottoottenere token csrf per richieste json post a un'app per rails

private_resource = RestClient::Resource.new('https://mysite.com') 

params = {:user => {:email => '[email protected]', :password => 'please'}} 
#log in 
login_response = private_resource['users/sign_in'].post(params, :content_type => :json, :accept => :json) 
#get cookie 
cookie = login_response.cookies 
#get json 
json_response = private_resource['products/new'].get(:content_type => :json, :accept => :json, :cookies => cookie) 
#another request that returns html form with authenticity token 
response_with_token = private_resource['products/new'].get(:cookies => cookie) 
#extract token 
token = Nokogiri::XML(response_with_token).css('input[name=authenticity_token]').first.attr('value') 
#update cookie 
cookie = response_with_token.cookies 
#populate form and insert token 
form = JSON.parse(json_response) 
form['name'] = "my product" 
form['authenticity_token'] = token 
#submit the request 
private_resource['products'].post(form.to_json, {:cookies => cookie, :content_type => :json, :accept => :json}) 

C'è la possibilità di disattivare la protezione CSRF per le richieste di JSON ma non vorrei piuttosto fare. Potrei andare al percorso della meccanizzazione o qualcosa di simile e quindi non mi preoccuperei delle richieste di JSON con CSRF ma volevo solo giocare con questa roba con rest-client

Immagino di essere solo curioso di sapere se c'è una ragione per cui non viene fornito autenticità_token per le richieste json e mi chiedo anche se c'è un modo migliore per risolvere il problema token rispetto all'approccio piuttosto hacky che ho preso qui

risposta

8

Inserisci il codice qui sotto nella tua applicazione controller:

def verified_request? 
    if request.content_type == "application/json" 
     true 
    else 
     super() 
    end 
end 

E chiamare questo metodo utilizzando before_filter.

Per ulteriori dettagli controllare: http://blog.technopathllc.com/2011/09/rails-31-csrf-token-authenticity-for.html

e verificare questo problema in rotaie: https://github.com/rails/rails/issues/3041

+1

Grazie per la risposta swati, sembra utile. Immagino che stavo cercando di evitare solo di disattivare i controlli CSRF. Mi sembra un po 'strano che le rotaie servano moduli json che non contengono alcun token ma che poi cercano un token. Avrebbe senso solo servire i moduli JSON con un token incluso piuttosto che spegnere gli assegni per il contenuto JSON? – Conor

+0

benvenuto ... sì, questo è solo un modo per aggirare il problema con il token CSRF. Se desideri passare il token con la tua richiesta JSON, puoi utilizzare l'intestazione come: intestazioni: { 'X-CSRF-Token': '<% = form_authenticity_token.to_s%>' } – swati

+0

controllo: http: // stackoverflow. it/questions/7203304/warning-cant-verify-csrf-token-authenticity-rails http://stackoverflow.com/questions/8503447/rails-how-to-add-csrf-protection-to-forms-created-in -javascript – swati

0

Nel vostro app/views/products/new.json.jbuilder, aggiungere questo:

json.authenticity_token form_authenticity_token 

Ciò inserire una chiave "authenticity_token" con l'essere il valore il token, quindi nel tuo json_response ottieni anche il token. Idea da this answer.

Problemi correlati