Вопрос

После обновления Rails 3.2 до Rails 4.1.4 доступ к приложению с помощью существующего сеанса (из более старой версии Rails 3.2) вызывает внутреннюю ошибку сервера.обратная трассировка:

JSON::ParserError - 795: unexpected token at {
I"session_id:ETI"%fa78a4ee07ac952c9b034ebc6199f30b;':
  /Users/.../.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/json/common.rb:155:in `parse'
  actionpack (4.1.4) lib/action_dispatch/middleware/cookies.rb:388:in `load'
  actionpack (4.1.4) lib/action_dispatch/middleware/cookies.rb:428:in `deserialize'
  actionpack (4.1.4) lib/action_dispatch/middleware/cookies.rb:183:in `verify_and_upgrade_legacy_signed_message'
  actionpack (4.1.4) lib/action_dispatch/middleware/cookies.rb:550:in `[]'
  actionpack (4.1.4) lib/action_dispatch/middleware/session/cookie_store.rb:114:in `get_cookie'
  actionpack (4.1.4) lib/action_dispatch/middleware/session/cookie_store.rb:90:in `block in unpacked_cookie_data'
  actionpack (4.1.4) lib/action_dispatch/middleware/session/abstract_store.rb:51:in `stale_session_check!'
  actionpack (4.1.4) lib/action_dispatch/middleware/session/cookie_store.rb:89:in `unpacked_cookie_data'
  actionpack (4.1.4) lib/action_dispatch/middleware/session/cookie_store.rb:83:in `block in extract_session_id'
  actionpack (4.1.4) lib/action_dispatch/middleware/session/abstract_store.rb:51:in `stale_session_check!'
  actionpack (4.1.4) lib/action_dispatch/middleware/session/cookie_store.rb:82:in `extract_session_id'
  actionpack (4.1.4) lib/action_dispatch/request/session.rb:49:in `block in []'
  actionpack (4.1.4) lib/action_dispatch/request/session.rb:48:in `[]'
  actionpack (4.1.4) lib/action_dispatch/request/session.rb:70:in `id'
  rack (1.5.2) lib/rack/session/abstract/id.rb:282:in `current_session_id'
  rack (1.5.2) lib/rack/session/abstract/id.rb:288:in `session_exists?'
  actionpack (4.1.4) lib/action_dispatch/request/session.rb:152:in `exists?'
  actionpack (4.1.4) lib/action_dispatch/request/session.rb:172:in `load_for_read!'
  actionpack (4.1.4) lib/action_dispatch/request/session.rb:89:in `[]'
  warden (1.2.3) lib/warden/session_serializer.rb:30:in `fetch'
  warden (1.2.3) lib/warden/proxy.rb:212:in `user'
  warden (1.2.3) lib/warden/proxy.rb:318:in `_perform_authentication'
  warden (1.2.3) lib/warden/proxy.rb:104:in `authenticate'
  warden (1.2.3) lib/warden/proxy.rb:114:in `authenticate?'
  devise (3.2.4) lib/devise/rails/routes.rb:460:in `block in constraints_for'
  actionpack (4.1.4) lib/action_dispatch/routing/mapper.rb:38:in `block in matches?'
  actionpack (4.1.4) lib/action_dispatch/routing/mapper.rb:36:in `matches?'
  actionpack (4.1.4) lib/action_dispatch/routing/mapper.rb:45:in `call'
  actionpack (4.1.4) lib/action_dispatch/journey/router.rb:71:in `block in call'
  actionpack (4.1.4) lib/action_dispatch/journey/router.rb:59:in `call'
  actionpack (4.1.4) lib/action_dispatch/routing/route_set.rb:678:in `call'
  ...

Я попытался изменить имя ключа сеансового файла cookie, но, похоже, он застрял. session_id.

# initializers/session_store.rb
MyApp::Application.config.session_store :cookie_store, key: 'myapp_session'

Пожалуйста помоги!Отличным решением также было бы удалить все файлы cookie сеанса до того, как они попадут в промежуточное программное обеспечение Rails, но я понятия не имею, как это сделать.

Это было полезно?

Решение

Нашел ответ здесь: https://github.com/rails/rails/issues/15111 .

Мои настройки имели

# initializers/cookie_serializer.rb
Rails.application.config.action_dispatch.cookies_serializer = :json
.

Я изменил его на

Rails.application.config.action_dispatch.cookies_serializer = :hybrid
.

и это сделал трюк

Другие советы

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

Бегать rake secret для создания нового секрета.

Если вы реализовали config/secrets.yml, поместите туда новый секрет.В противном случае, если у вас все еще есть ваш секрет config/initializers/secret_token.rb, положи это туда.

Оставь свой config/initializers/session_store.rb только файл — вам не нужно его менять.

В config/initializers/cookie_store.rb, измените его на :json:

# Be sure to restart your server when you modify this file.

Rails.application.config.action_dispatch.cookies_serializer = :json

Я могу подтвердить, что это работает, даже если ваш браузер хранит старый файл cookie сеанса.При изменении секрета, когда кто-то со старым файлом cookie сеанса посещает ваш сайт, сервер просто игнорирует состояние старого сеанса и создает новый сеанс.Нет ошибки 500.

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

Я думаю, что изменение секрета - лучшее решение проблемы, чем переход на: гибрид, как @Thibaut Barrère, указанный в комментариях

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top