Pregunta

Después de actualizar a los Rieles 4.1.4 de Rails 3.2, el acceso a la aplicación con una sesión existente (desde los más antiguos Rieles de la versión 3.2) provoca un error interno del servidor.traza:

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'
  ...

He intentado cambiar la cookie de sesión nombre de la clave, pero parece estar atascado en session_id.

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

Por favor, ayuda!Una gran solución sería eliminar todas las cookies de sesión antes de que lleguen los rieles de middleware, pero no tengo idea de cómo hacer eso..

¿Fue útil?

Solución

Encontré la respuesta aquí: https://github.com/rails/rails/issues/15111

Mi configuración tenía

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

lo cambié a

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

y eso hizo el truco

Otros consejos

Si usted se siente cómodo con el cambio de su clave secreta, a continuación, se va a resolver el problema, y puedo confirmar que las personas con edad de las cookies no encuentro un error 500.

Ejecutar rake secret para generar un nuevo secreto.

Si has implementado config/secrets.yml, poner el nuevo secreto de allí.De lo contrario, si usted todavía tiene su secreto en config/initializers/secret_token.rb, la puso ahí.

Deja tu config/initializers/session_store.rb archivo a solas, no es necesario cambiarlo.

En config/initializers/cookie_store.rb, cambiar a :json:

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

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

Puedo confirmar que esto funciona, incluso cuando su navegador está almacenando un viejo cookie de sesión.Cambiando el secreto, cuando alguien con un viejo cookie de sesión visitas a su sitio, el servidor simplemente ignora el antiguo estado de la sesión y se crea una nueva sesión.No hay error 500.

Acabo de tener el mismo problema y usé la respuesta aquí y todo fue arreglado. Después de leer los comentarios, aunque descubrí que simplemente cambiar el secreto también solucionó el problema, ya que debo suponer.

Creo que cambiar el secreto es una mejor solución al problema que cambiar a: híbrido como @thibaut barrère declarado en los comentarios

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top