Rails 4 JSON :: ParseErrorをアップグレードします
-
21-12-2019 - |
質問
Rails 4.1.4 Rails 3.2からアップグレードした後、既存のセッション(古いレール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'
...
.
セッションCookieキー名を変更しようとしましたが、session_id
に停止しているようです。
# initializers/session_store.rb
MyApp::Application.config.session_store :cookie_store, key: 'myapp_session'
.
助けてください!素晴らしい解決策は、Railsミドルウェアにヒットする前にすべてのセッションクッキーを削除することもありますが、それを行う方法はわかりません。
解決
ここでの回答を見つけた: https://github.com/rails/rails/issues/15111
私の設定は
# 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
.
ブラウザが古いセッションCookieを格納している場合でも、これが機能することを確認できます。秘密を変更することによって、古いセッションCookieを持つ誰かがあなたのサイトを訪問すると、サーバーは古いセッション状態を無視して新しいセッションを作成します。500エラーはありません。
私は同じ問題を抱えていてここで答えを使いました、そしてすべてが修正されました。 私は秘密を変えるだけで問題を解読した後、私は問題を修正しました。
私は秘密を変えることは、次のように切り替えることよりも問題をより良い解決策であると思います。