Rails levanta un InvalidAuthenticityToken
cuando el token CSRF no coincide. Pero, al leer el source, no puedo entender cómo sucede esto en realidad. Comienzo anotando el árbol para esa clase:¿Cómo funciona la protección Rails CSRF?
$ ack --ignore-dir=test InvalidAuthenticityToken
actionpack/lib/action_controller/metal/request_forgery_protection.rb
4: class InvalidAuthenticityToken < ActionControllerError #:nodoc:
17: # which will check the token and raise an ActionController::InvalidAuthenticityToken
actionpack/lib/action_dispatch/middleware/show_exceptions.rb
22: 'ActionController::InvalidAuthenticityToken' => :unprocessable_entity
Solo dos aciertos, ignorando el comentario. El primero es la definición de clase:
class InvalidAuthenticityToken < ActionControllerError #:nodoc:
end
El segundo es traducir la excepción en un código de estado HTTP. protección CSRF se habilita llamando protect_from_forgery
en el controlador, por lo que vamos a ver que:
def protect_from_forgery(options = {})
self.request_forgery_protection_token ||= :authenticity_token
before_filter :verify_authenticity_token, options
end
Se añade un filtro:
def verify_authenticity_token
verified_request? || handle_unverified_request
end
¿Qué le llama a esto cuando la verificación falla:
def handle_unverified_request
reset_session
end
Entonces, ¿cómo se plantea realmente InvalidAuthenticityToken
?
Gracias! Eso es lo que obtengo al ejecutar 3.0.3 pero leyendo la fuente de master. Gran explicación del razonamiento detrás de este cambio: es incluso mejor que lo que figura en la publicación oficial del blog. –