Rails поднимает InvalidAuthenticityToken
, когда токен 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
Только два попадания, игнорируя комментарий. Первое определение класса:
class InvalidAuthenticityToken < ActionControllerError #:nodoc:
end
Второй переводит исключение в код состояния HTTP. Защита от CSRF включается при вызове protect_from_forgery
в контроллере, поэтому давайте посмотрим на это:
def protect_from_forgery(options = {})
self.request_forgery_protection_token ||= :authenticity_token
before_filter :verify_authenticity_token, options
end
Добавляет фильтр:
def verify_authenticity_token
verified_request? || handle_unverified_request
end
Который вызывает это при сбое проверки:
def handle_unverified_request
reset_session
end
Так как же на самом деле InvalidAuthenticityToken
поднимается?