Как декодировать cookie из заголовка рукопожатия при подключении к websocket? (Рубин)

Я бегу Sinatra приложение в EventMachine.run цикл и по моему ws.onopen метод, который я хочу проверить handshake cookie заголовка, чтобы гарантировать, что входящий запрос поступает от зарегистрированного пользователя моего веб-приложения.

мой Sinatra Приложение включает в себя следующее:

use Rack::Session::Cookie,  :key => COOKIE_KEY,
                            :path => '/',
                            :expire_after => 2592000, #30 days
                            :secret => COOKIE_SECRET

и мой ws.onopen метод выглядит так (обрезается)

ws.onopen { |handshake|
  cookie, bakesale = handshake.headers['Cookie'].split('=')
  rack_cookie = Rack::Session::Cookie.new(MyApp, {
    :key => COOKIE_KEY,
    :path => '/',
    :expire_after => 2592000, #30 days
    :secret => COOKIE_SECRET
  })
  decoded = rack_cookie.coder.decode(bakesale)
  puts "decoded: #{decoded}"

}

Значение cookie соответствует моему COOKIE_KEY очень хорошо, однако значение decoded является nil

Как мне декодировать входящие данные cookie?

-- некоторое время спустя --

Я изменил немного выше, чтобы

ws.onopen { |handshake|
  cookie, bakesale = handshake.headers['Cookie'].split('=')
  rack_cookie = Rack::Session::Cookie.new(MyApp, {
    :key => COOKIE_KEY,
    :path => '/',
    :expire_after => 2592000, #30 days
    :secret => COOKIE_SECRET,
    :coder => Rack::Session::Cookie::Base64.new
  })

  puts rack_cookie.coder.decode(bakesale)

}

и что выводит

?q?[?????ov??????to?Z???294cb6e2b95e9?##v3???#c&F3#SC?CSC#CSs?c3sSCCs?cCm;FI"__FLASH__;F{I" user;FU:Moped::BSO?㣤?&?V7D?B!

который выглядит так, как будто он нуждается в сортировке.

тем не мение Marshal.load (rack_cookie.coder.decode(bakesale)) бросает исключение, говоря dump format error for symbol(0x10)

- и еще больше времени спустя -

Я тоже пробовал rack_cookie.coder.decode(bakesale.split('--').first)

что привело к

??H?d????=?d:ETI"E7ce599b294cb6e2b95e9?##v3???#c&F3#SC?CSC#CSs?c3sSCCs?cCm;FI"__FLASH__;F{I" user;FU:Moped::BSO?㣤?&?V7D?B!

Итак, как вы можете видеть, есть небольшая разница, но в любом случае мне нужно как-то превратить это в действительный хеш.

Marshal.load (rack_cookie.coder.decode (bakesale.split ('-'). First)) по-прежнему приводит к dump format error for symbol(0x10) в любом случае.

Поэтому я чувствую, что я ближе, но сигары пока нет.

1 ответ

Решение

Ответ заключается в использовании Rack::Utils.unencode,

У меня сейчас это работает

Marshal.load(rack_cookie.coder.decode(Rack::Utils.unescape(bakesale.split('--').first))) отлично декодирует до нужного мне хэша, что позволяет мне извлечь идентификатор пользователя. W00t!

Большое спасибо пользователю spastorino по адресу https://github.com/rack/rack/issues/551 за указание в правильном направлении.

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