【发布时间】:2013-04-25 02:08:50
【问题描述】:
我在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)) 抛出异常,说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)。
所以我觉得我更接近了,但还没有雪茄。
【问题讨论】:
-
我将整个示例框架放在一个要点中,以帮助澄清这个问题。 gist.github.com/davesag/5506864
标签: ruby cookies rack eventmachine