Pergunta

Depois de actualizar para o Rails 4.1.4 do Rails 3.2, acessando a aplicação com uma sessão existente (do mais antigo Rails 3.2 versão) faz com que um erro interno do servidor.backtrace:

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

Eu tentei mudar o cookie de sessão nome de chave, mas parece ser preso em session_id.

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

Por favor, ajuda!Uma ótima solução também seria excluir todos os cookies de sessão antes de bater os trilhos de middleware, mas eu não tenho nenhuma idéia de como fazer isso..

Foi útil?

Solução

Encontrei a resposta aqui: https://github.com/rails/rails/issues/15111

Minhas configurações tinha

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

Eu mudei para

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

E que fez o truque

Outras dicas

Se você estiver confortável com a mudança de sua chave secreta, em seguida, ele vai resolver o problema, e posso confirmar que as pessoas com idade cookies não vai encontrar um erro 500.

Executar rake secret para gerar um novo segredo.

Se você tiver implementado config/secrets.yml, colocar o novo segredo lá.Caso contrário, se você ainda tem o seu segredo config/initializers/secret_token.rb, colocá-lo lá.

Deixe o seu config/initializers/session_store.rb arquivo sozinho -- você não precisa mudar.

No config/initializers/cookie_store.rb, alterá-lo para :json:

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

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

Eu posso confirmar que isso funciona, mesmo quando o seu navegador está a armazenar um velho cookie de sessão.Alterando o segredo, quando alguém com um velho cookie de sessão visitas de seu site, o servidor simplesmente ignora o antigo estado da sessão e cria uma nova sessão.Nenhum erro 500.

Eu apenas tive o mesmo problema e usado a resposta aqui e tudo estava resolvido.Depois de ler os comentários que eu achei que só mudando o segredo também foi corrigido o problema, como eu suponho.

Eu acho que mudando o segredo é uma solução melhor para o problema de mudar para :híbrido como @Thibaut Barrère indicado nos comentários

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top