Как декодировать 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??????to?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 за указание в правильном направлении.