如何从websocket连接握手的头部解码cookie? (ruby)
我在EventMachine.run
循环中运行Sinatra
应用程序,在我的ws.onopen
方法中,我希望检查handshake
标头的cookie,以确保传入的请求来自我的webapp的注册用户。
我的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))
抛出一个exception,说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)
。
所以我觉得我离我更近了,但还没有雪茄。
答案是使用Rack::Utils.unencode
。
我现在有这个工作
Marshal.load(rack_cookie.coder.decode(Rack::Utils.unescape(bakesale.split('--').first)))
完美地解码我需要的哈希,允许我提取用户ID。 W00t!
非常感谢用户spastorino在https://github.com/rack/rack/issues/551指出我正确的方向。