Como decodificar um cookie do cabeçalho de um handshake de conexão de websocket? (Rubi)
Eu estou correndo umSinatra
app dentro de umEventMachine.run
loop e na minhaws.onopen
método gostaria de verificar ohandshake
cookie do cabeçalho para garantir que a solicitação recebida seja proveniente de um usuário registrado da minha webapp.
MinhasSinatra
aplicativo inclui o seguinte:
use Rack::Session::Cookie, :key => COOKIE_KEY,
:path => '/',
:expire_after => 2592000, #30 days
:secret => COOKIE_SECRET
e meuws.onopen
método se parece com isso (aparado)
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}"
}
O valor decookie
corresponde ao meuCOOKIE_KEY
muito bem, no entanto, o valor dedecoded
énil
Como devo decodificar os dados do cookie recebido?
-- algum tempo depois --
Eu mudei o acima ligeiramente para
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)
}
e que saídas
?q?[?????ov??????to?Z???294cb6e2b95e9?##v3???#c&F3#SC?CSC#CSs?c3sSCCs?cCm;FI"__FLASH__;F{I" user;FU:Moped::BSO?㣤?&?V7D?B!
que parece que precisa de marshalling.
ContudoMarshal.load (rack_cookie.coder.decode(bakesale))
lança uma exceção, dizendodump format error for symbol(0x10)
- e ainda mais tempo depois -
Eu também tenteirack_cookie.coder.decode(bakesale.split('--').first)
que resultou em
??H?d????=?d:ETI"E7ce599b294cb6e2b95e9?##v3???#c&F3#SC?CSC#CSs?c3sSCCs?cCm;FI"__FLASH__;F{I" user;FU:Moped::BSO?㣤?&?V7D?B!
Então, como você pode ver, há uma pequena diferença, mas de qualquer forma eu preciso transformar isso em um hash válido.
Marshal.load (rack_cookie.coder.decode (bakesale.split ('-'). First)) ainda resulta emdump format error for symbol(0x10)
de qualquer jeito.
Então eu sinto que estou mais perto, mas não tenho charuto ainda.