Question

Après la mise à niveau vers Rails 4.1.4 à partir de Rails 3.2, l'accès à l'application avec une session existante (à partir de l'ancienne version de Rails 3.2) provoque une erreur de serveur interne.trace :

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

J'ai essayé de changer le nom de la clé du cookie de session, mais elle semble bloquée session_id.

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

S'il vous plaît, aidez-moi !Une excellente solution serait également de supprimer tous les cookies de session avant qu'ils n'atteignent le middleware rails, mais je n'ai aucune idée de comment faire cela.

Était-ce utile?

La solution

J'ai trouvé la réponse ici : https://github.com/rails/rails/issues/15111

Mes paramètres avaient

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

Je l'ai changé en

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

Et ça a fait l'affaire

Autres conseils

Si vous êtes à l'aise avec la modification de votre clé secrète, cela résoudra le problème et je peux confirmer que les personnes possédant d'anciens cookies ne rencontreront pas d'erreur 500.

Courir rake secret pour générer un nouveau secret.

Si vous avez mis en œuvre config/secrets.yml, mettez le nouveau secret là-dedans.Sinon, si tu as encore ton secret config/initializers/secret_token.rb, mets-le là.

Laisser votre config/initializers/session_store.rb fichier seul - vous n'avez pas besoin de le modifier.

Dans config/initializers/cookie_store.rb, change-le en :json:

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

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

Je peux confirmer que cela fonctionne, même lorsque votre navigateur stocke un ancien cookie de session.En modifiant le secret, lorsqu'une personne possédant un ancien cookie de session visite votre site, le serveur ignore simplement l'ancien état de session et crée une nouvelle session.Pas d'erreur 500.

J'ai juste eu le même problème et j'ai utilisé la réponse ici et tout a été résolu.Après avoir lu les commentaires, j'ai découvert que le simple fait de changer le secret résolvait également le problème, comme il se doit, je suppose.

Je pense que changer le secret est une meilleure solution au problème que de passer à :hybrid comme @Thibaut Barrère l'a déclaré dans les commentaires

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top