Мы используем EngineYard Cloud для развертывания нашего приложения Ruby on Rails. Мы работаем с Rails v2.3.3.
EngineYard Cloud развертывается на экземплярах AWS аналогично Capistrano. После каждого развертывания мы сталкиваемся с ошибками Invalid Authenticity Token. В частности, любой пользователь, который ранее посещал наше приложение, а затем посещает после развертывания и затем пытается отправить форму, получает ошибку токена неверной аутентификации. Эта ошибка сохраняется, пока они не сбросят свои куки для сайта. После сброса файлов cookie сайт работает, как и ожидалось, без ошибок.
Мы используем хранилище сеансов ActiveRecord, и сеансы сохраняются в базе данных.
Это ошибка, которую мы видим:
ActionController :: InvalidAuthenticityToken
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/request_forgery_protection.rb:79:in `verify_authenticity_token '
Объект сеанса после развертывания равен nil, однако данные сеанса все еще сохраняются в базе данных, а cookie идентификатора сеанса все еще существует:
Сессия:
- идентификатор сессии: ноль
- данные: ноль
Мы не смогли объяснить это. Любые мысли о том, что может быть основной причиной?
Спасибо за любые предложения!
РЕДАКТИРОВАТЬ: просто чтобы обновить это, мы смогли выделить пример ошибки.
1) Форма загрузки пользователя
2) Код обновляется на сервере
3) Пользователь отправляет форму
** Ошибка неверного токена подлинности
Похоже, что при изменении среды Rails не может справиться с этим с помощью маркера аутентичности.
Мы попытались решить несколько шагов:
- Сброс сеанса
- Удаление cookie сессии (как в JavaScript, так и в Rails)
- Стирание таблицы сеансов в базе данных после развертывания кода
Ничего не работает. Единственное, что работает, - это чтобы пользователь удалил свои куки на стороне клиента.
(Мы гуглили (даже пробовали Binging!) За ответы, но не играли в кости. Похоже, похожая проблема: http://railsforum.com/viewtopic.php?id=21479)
Кроме того: изначально мы думали, что это было связано с нашим развертыванием в EngineYard, но мы также смогли воспроизвести его на нашем сервере разработки, на котором мы развертываем через Capistrano.
Любые мысли будут с благодарностью приняты.
Спасибо!