Расшифровать сеансовый cookie Rail 4 из потока веб-сокетов

Рельсы 4.1.8, рубин 2.1.5p273

Я пытаюсь получить идентификатор сессии изнутри EventMachine::WebSocket нить.

session а также cookie объекты здесь недоступны, поэтому необходимо вручную расшифровать cookie из заголовков рукопожатия websocket. Cookie это что-то вроде этого:

SFRRZHJGZUtMQnZPeFd2QktjTVc0bVdDQUkvbjhueVczTFpZdG9Ed1ozMGN1dzFjVXhOZGwvOUJLTlZqd29hMDVha3lEN0hleUZtZDZjN2NCa3lIQ0FsWHFoMVQ0SytaV1U0UHc0emo4L2pNUC9MVVNVQVR4c01JS1FmUS9DejRkN3p4cmVEMXROS1NEZk1uNDcvbXF2VEhzMHMyVEZPZytIMDR0aDd3YUZnPS0tZENYRFVzL1psS0hZRFA5M0l4WGZuZz09--2ed3a27ad19bd19bd3b5bf12d164b53665d5323e

Я пробовал этот и этот варианты, но оба не удалось

Первый способ:

arr = handshake.headers['Cookie'].split ';'
cookies = {}
arr.each do |rec|
  key,value = rec.split '='
  cookies[key.strip] = value.strip
end
rack_cookie = Rack::Session::Cookie.new(App, { # App name changed
      :key => Rails.application.config.session_options[:key],
      :path => '/',
      :expire_after => 2592000, #30 days
      :secret => Rails.application.secrets.secret_key_base,
      :coder => Rack::Session::Cookie::Base64.new
  })
sess = cookies[Rails.application.config.session_options[:key]]
return rack_cookie.coder.decode(Rack::Utils.unescape(sess.split('--').first))

Получил строку, как это:

muHBVeeYknNJyb43HpVC3lnlDwJ+rC2NGFtBM2y4Nzu6qA+D1sNkmnQY4nRTJx1kl0znz1kkupGFe/ilRjAg1eJNaxFPJhVmBrkp+TBwu38R7+igGj2edkYkFBCandq9XuFn3ILFYwvszMV6iVc0Z2Ftfg6lyIwPfLi5UJMJM3E=--ZIy+dc//zwk/zs3qsaq9vQ==

Когда я пытаюсь Marshal.load эта строка, получите ошибку:

TypeError: incompatible marshal file format (can't be read)
        format version 4.8 required; 109.117 given

Второй способ:

message = URI.unescape sess # sess from prevois code block, btw sess == message
config = Rails.application.config

key_generator = ActiveSupport::KeyGenerator.new(
  Rails.application.secrets.secret_key_base, iterations: 1000
)
secret = key_generator.generate_key(
  config.action_dispatch.encrypted_cookie_salt
)
sign_secret = key_generator.generate_key(
  config.action_dispatch.encrypted_signed_cookie_salt
)

encryptor = ActiveSupport::MessageEncryptor.new(
  secret, sign_secret
)

encryptor.decrypt_and_verify message

Получите эту ошибку:

ActiveSupport::MessageEncryptor::InvalidMessage: ActiveSupport::MessageEncryptor::InvalidMessage

Как расшифровать этот файл cookie?

1 ответ

+ Изменить

ActiveSupport::MessageEncryptor.new(secret, sign_secret)

в

ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: JSON)

Это должно работать (с настройками по умолчанию).

Источник: https://gist.github.com/madwork/858316306a3ebe54a54f

Другие вопросы по тегам