Sto tentando di ottenere il caching completo delle pagine in Rails, ma ho riscontrato un grosso problema riguardo CSRF, o forse solo la mia comprensione. Attualmente ho la stringa form_authenticity_token
memorizzata in un cookie con cui JS può accedere e riscrivere i tag di intestazione.Rails 4 token di autenticità - sia nell'intestazione che nell'input nascosto della forma?
Ci sono due posti trovo gettoni nel mio codice HTML generato:
1) nella testa
<meta name="csrf-token" content="[hash]">
2) All'interno elemento di input nascosto di una forma
<input type="hidden" name="authenticity_token" value="[different hash]">
Come indicato, questi hash sono diversi l'uno dall'altro (in modalità di sviluppo in cui la memorizzazione nella cache non è abilitata ndr). Perché sono diversi? Perché posso eliminare i meta tag principali e lasciare solo l'input del modulo e la richiesta è consentita? Eppure quando elimino il tag di input del modulo e lascia le intestazioni la richiesta viene respinta?
Questo significa che i cartellini sono inutili, no? Posso riscrivere il tag di input del modulo sul valore nel mio cookie proprio come ho fatto con i tag di intestazione, ma dal momento che sono diversi l'uno dall'altro sono cauto riguardo a cosa il risultato finale potrebbe significare soprattutto quando si tratta di cache della pagina intera .
Applicazione controller contiene:
protect_from_forgery with: :exception
before_filter :csrf_cookie
def csrf_cookie
cookies['authenticity-token'.freeze] = {
value: form_authenticity_token,
expires: 1.day.from_now,
secure: (Rails.env.staging? || Rails.env.production?)
}
end