staging のアプリケーションでのみ起こるバグを調査している折、どうやらセッションにちゃんと値をセットできていないぽいと気付いた。
そのアプリは cookie session を採用していたので簡単に暗号化された値は手に入ったが、これはどうやったらデコードできるんだろうと思って同僚にアドバイスを求めたら A simple script to decode Rails 4 session cookies · GitHub あたりに辿り着いた。
貼った gist だと諸々 require
しているが、該当のアプリケーションの Rails console に入れれば以下で OK だった。
def decrypt_session_cookie(cookie, key) cookie = CGI::unescape(cookie) # Default values for Rails 4 apps key_iter_num = 1000 key_size = 64 salt = "encrypted cookie" signed_salt = "signed encrypted cookie" key_generator = ActiveSupport::KeyGenerator.new(key, iterations: key_iter_num) secret = key_generator.generate_key(salt) sign_secret = key_generator.generate_key(signed_salt) encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: ActiveSupport::MessageEncryptor::NullSerializer) encryptor.decrypt_and_verify(cookie) end # Take the following value from your cookie for your web site cookie = 'your encrypted cookie' key = ENV['SECRET_KEY_BASE'] puts decrypt_session_cookie(cookie, key)
store が cookie でなくて memcached とかだと値を拾うための key がアプリケーションの独自ロジックで生成されたりしていてもっと大変になると思う。
余談だが、クエリストリングをセッションに格納するだけの処理がうまくいってなくておかしかったそのバグは、クエリストリングが nginx のレイヤーで落とされているために起きていた。ローカルではそのレイヤーを設けてないので再現しなかったわけだ。(本当は環境をきちんと合わせた方が良さそう)
環境
- Rails 4.2.7.1