У меня есть приложение электронной коммерции, работающее на Rails 5.1.5 с redis-session-store
, но, похоже, существует проблема параллелизма с сессиями, когда я открываю более 1 вкладки одновременно.
Вот пример того, как воспроизвести проблему:
- Представьте, что вы либо никогда не обращались к приложению, либо вы просто очистили куки;
- Затем вы открываете две ссылки на других вкладках довольнобыстро, поэтому вторая вкладка открыта до того, как первая завершит запрос;
- Теперь на одной из вкладок у вас есть недопустимый CSRF-токен.И нет никакого способа определить, какой это.
Из того, что я видел до сих пор, кажется, что сервер действительно назначает каждому запросу разные session_id, один переопределяет другой, как вы можете видетьв репродукции ниже:
# first request
method=GET path=/my-url format=html controller=ProductsController action=show status=200 session=8cb3c8e8481f4e04772b5d77125132df
# second request
method=GET path=/other-url format=html controller=ProductsController action=show status=200 session=da126c627467fb5e2ab8be9e82c22b85
# notice the different session ids
Эта информация о сеансе, конечно, добавляется в полезную нагрузку логарифма следующим образом:
#app/controllers/application_controller.rb
def append_info_to_payload(payload)
super
payload[:session] = request.session_options[:id] rescue ""
end
После этого на одной из вкладок будет неверный csrf.и это вызовет действительно неловкие проблемы, потому что, поскольку все кнопки «Добавить в корзину» являются кнопками method: :post, remote: true
, когда пользователи пытаются добавить товар в свои корзины, они фактически оказываются на пустой странице корзины из-за направляющиханнулирование сеанса пользователя, когда Can't verify CSRF token authenticity.
происходит.
Есть мысли?
Редактировать:
Изучая файлы cookie в инструментах разработчика Chrome, яМожно сказать, что обе вкладки имеют один и тот же session_id, как и ожидалось. Таким образом, эта проблема относится только к CSRF-токену, сгенерированному до переопределения session_id.