문제

Rails로 업그레이드 한 후 Rails 3.2에서 기존 세션 (이전 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'
  ...
.

세션 쿠키 키 이름을 변경하려고했지만 session_id에 붙어있는 것 같습니다.

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

도와주세요!훌륭한 솔루션은 레일 미들웨어를 때리기 전에 모든 세션 쿠키를 삭제할 수도 있지만 그를 어떻게하는지 전혀 모르겠습니다.

도움이 되었습니까?

해결책

발견 https://github.com/rails/rails/issues/15111 / P>

내 설정이

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

나는 그것을

로 바꿨다.
Rails.application.config.action_dispatch.cookies_serializer = :hybrid
.

그리고 그게 트릭

다른 팁

비밀 키를 변경하는 데 편안한 경우 문제가 해결 될 것이고 오래된 쿠키를 가진 사람들이 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
.

브라우저가 이전 세션 쿠키를 저장하는 경우 에도이 작업이 작동하는지 확인할 수 있습니다.비밀을 변경함으로써 이전 세션 쿠키가있는 사람이 사이트를 방문하면 서버는 이전 세션 상태를 무시하고 새 세션을 만듭니다.500 개의 오류가 없습니다.

나는 똑같은 문제를 가졌고 여기에서 답을 사용하고 모두가 수정되었습니다. 코멘트를 읽은 후에 나는 비밀을 바꾸는 것만으로도 문제가 해결되었음을 발견했다.

비밀을 바꾸는 것보다 문제의 더 나은 해결책은 다음과 같은 것보다 더 나은 해결책이라고 생각합니다. @thibaut barree와 같은 하이브리드

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top