3.0.7 から 3.2.6 にアップグレードした Rails アプリケーションがあります。私はセッション ストアに Dalli と memcached を使用しています。
アップグレードしてから、WARNING: Can't verify CSRF token authenticity
エラーが発生し始め、セッションがリセットされています。
csrf_meta_tags
ヘッダーで呼び出します。
私の ApplicationController ではverify_authenticity_token
、アプリが csrf_token を認識しているものを確認するためにオーバーライドしました。
def verify_authenticity_token
verified_request?
Rails.logger.info "+++ VERIFY AUTH TOKEN +++"
Rails.logger.info session.inspect
end
アプリからフォームを送信しました。ロガーに書き込まれたセッション データは次のとおりです。
{"_csrf_token"=>"4OQ47F2py+l12lLSTnq0RTmyPbmPi2UGMZaPhMG6vVQ="}
これは、メタ タグでページに設定された値や、フォームで送信された値とは異なります。
{"authenticity_token"=>"qMsdBkTHoBH09+X0tnyoPsbtc752yKjCVHddrcufd7g="}
問題が解決しました
これは構成エラーが原因であることが判明しました。
session_store
config/initializers/session_store.rb で構成を設定していました。
require 'action_dispatch/middleware/session/dalli_store'
Rails.application.config.session_store :dalli_store
これはすべての環境で初期化されましたが、開発環境では、キャッシュのデフォルト構成はconfig.perform_caching = false
.
イニシャライザ ファイルを削除し、セッション ストアの設定を production.rb ファイルに移動すると、問題が解決しました。
config.session_store = :dalli_store, 'localhost:11211'
これが 3.0.2 では問題にならなかったのに、3.2.6 では問題になった理由がわかりません。