La mia risposta prende in prestito pesantemente sia da @Jimbo sia da @Sija, tuttavia sto usando la convenzione di devise/angularjs suggerita a Rails CSRF Protection + Angular.js: protect_from_forgery makes me to log out on POST e ho elaborato un po 'sul mio blog quando inizialmente l'ho fatto. Questo ha un metodo sul controller applicazione per impostare i cookie per CSRF:
after_filter :set_csrf_cookie_for_ng
def set_csrf_cookie_for_ng
cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
end
Così sto utilizzando @ formato di Sija, ma usando il codice da questa soluzione in precedenza SO, dandomi:
class SessionsController < Devise::SessionsController
after_filter :set_csrf_headers, only: [:create, :destroy]
protected
def set_csrf_headers
cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
end
end
Per completezza, poiché mi ci sono voluti un paio di minuti per risolverlo, noto anche la necessità di modificare il file config/routes.rb per dichiarare che hai sovrascritto il controller delle sessioni. Qualcosa di simile:
devise_for :users, :controllers => {sessions: 'sessions'}
Questo è stato anche parte di una grande pulizia CSRF che ho fatto sulla mia domanda, che potrebbe essere interessante per gli altri. Il blog post is here, le altre modifiche includono:
Salvataggio da ActionController :: InvalidAuthenticityToken, il che significa che se le cose non vengono sincronizzate, l'applicazione si risolverà da sola, piuttosto che l'utente che ha bisogno di cancellare i cookie. Come stanno le cose in rotaie Credo che il controller applicazione sarà in default con:
protect_from_forgery with: :exception
In tale situazione, è quindi necessario:
rescue_from ActionController::InvalidAuthenticityToken do |exception|
cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
render :error => 'invalid token', {:status => :unprocessable_entity}
end
Ho anche avuto qualche dolore con condizioni di gara e alcune interazioni con il modulo timeoutable in Devise, che ho commentato ulteriormente nel post del blog: in breve, dovresti prendere in considerazione l'utilizzo di active_record_store piuttosto che cookie_store e prestare attenzione all'emissione di richieste parallele vicino a sign_in e sign_out actions.
qualcuno sa se questo problema è stato sollevato con gli sviluppatori di Devise? – IanWhalen
# 2 non funziona per me perché sto ottenendo l'errore di autenticità CSRF dopo l'accesso tramite Devise/Ajax con qualsiasi richiesta POST che faccio successivamente. Sono anche incerto su come eseguire il rendering dei nuovi token csrf perché sto già facendo il rendering di un modello come passaggio finale nella mia azione ': create'. Ho fatto una domanda al riguardo qui (http://stackoverflow.com/questions/26640326/after-devise-sign-in-via-ajax-any-post-request-results-in-csrf-authenticity-err) e lo apprezzerei davvero se avessi un momento per dare un'occhiata a – sixty4bit
@ sixty4bit. Sembra che tu abbia lo stesso problema di te, ma la tua domanda è stata cancellata. L'hai mai capito? –