Frage

Nach dem Upgrade von Rails 3.2 auf Rails 4.1.4 führt der Zugriff auf die Anwendung mit einer vorhandenen Sitzung (ab der älteren Rails 3.2-Version) zu einem internen Serverfehler.rückverfolgung:

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

Ich habe versucht, den Namen des Sitzungscookie-Schlüssels zu ändern, aber er scheint hängen zu bleiben session_id.

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

Bitte helfen Sie!Eine großartige Lösung wäre auch, alle Sitzungscookies zu löschen, bevor sie auf die Middleware von Rails treffen, aber ich habe keine Ahnung, wie das geht..

War es hilfreich?

Lösung

fand die Antwort hier: https://github.com/rails/rails/issues/15111

Meine Einstellungen hatten

generasacodicetagpre.

Ich habe es auf

geändert generasacodicetagpre.

und das tat der Trick

Andere Tipps

Wenn Sie mit dem Ändern Ihres geheimen Schlüssels vertraut sind, wird das Problem dadurch gelöst, und ich kann bestätigen, dass Personen mit alten Cookies nicht auf einen 500-Fehler stoßen.

Laufen rake secret um ein neues Geheimnis zu generieren.

Wenn Sie implementiert haben config/secrets.yml, lege das neue Geheimnis dort hinein.Andernfalls, wenn Sie noch Ihr Geheimnis haben config/initializers/secret_token.rb, steck es da rein.

Lassen Sie Ihre config/initializers/session_store.rb datei allein - Sie müssen sie nicht ändern.

In config/initializers/cookie_store.rb, ändern Sie es in :json:

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

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

Ich kann bestätigen, dass dies funktioniert, auch wenn Ihr Browser ein altes Sitzungscookie speichert.Durch Ändern des Geheimnisses ignoriert der Server einfach den alten Sitzungsstatus und erstellt eine neue Sitzung, wenn jemand mit einem alten Sitzungscookie Ihre Site besucht.Kein 500-Fehler.

Ich hatte gerade das gleiche Problem und nutzte die Antwort hier und alles wurde behoben. Nachdem ich die Kommentare gelesen habe, obwohl ich feststellte, dass das Geheimnis nur das Problem behoben hat, wie ich nehme.

Ich denke, das Geheimnis zu ändern ist eine bessere Lösung für das Problem als das Umschalten auf: Hybrid wie @thibaut Barrère in den Kommentaren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top