2014-01-21 7 views
3

Я продолжаю работать в InvalidAuthenticityToken ошибках с приложением, над которым я сейчас работаю. Я использую rollbar для отслеживания всех ошибок, и в каждом случае пользователь отправляет заголовок HTTP X-Csrf-Token Header. Запросы - это все запросы AJAX, отправленные с использованием javascript javascript (с jquery_ujs). Пользователи часто открывают сразу несколько вкладок - не уверен, что это может иметь к этому какое-то отношение.Rails 4 InvalidAuthenticityToken

Я просмотрел исходный код в рельсах, который проверяет токены подлинности, и я не вижу причин, по которым они стали бы недействительными, если сеанс каким-то образом не истек.

Любые идеи относительно того, почему я постоянно сталкиваюсь с этой проблемой, будут весьма признательны.

ответ

3

Как вы говорите, это, скорее всего, связано с истечением срока действия сеанса перед тем, как пользователь запускает запрос AJAX на вкладке, открытой давно.

В Rails 4 стратегии по умолчанию для обработки запросов непроверенных это вызовет ошибку InvalidAuthenticityToken:

От /app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 
end 

От actionpack/Lib/action_controller/металла /request_forgery_protection.rb:

class Exception 
    def initialize(controller) 
    @controller = controller 
    end 

    def handle_unverified_request 
    raise ActionController::InvalidAuthenticityToken 
    end 
end 

вы можете использовать: null_session как непроверенная стратегию обработки запросов, если вы хотите, чтобы пр при возникновении ошибки.

Вы также можете попробовать увеличить тайм-аут сеанса, чтобы узнать, уходит ли проблема или становится менее частым.

Для более глубокого объяснения Rails 4 новых дефолтов защиты CSRF вы можете прочитать:

Forgery Protection Strategy

+0

diegog, вероятно, правильно. Предполагая, что вы можете подтвердить, что это проблема, вы можете настроить таймер JavaScript для автоматического обновления страницы по истечении срока действия сеанса. Увеличение тайм-аута сеанса, как предполагает diegog, может не работать, если пользователь закрывает свой ноутбук вечером, а затем взаимодействует со ссылкой AJAX на странице несколько часов или дней позже. –

Смежные вопросы