如何从websocket连接握手的头部解码cookie?(红宝石)

Dav*_*Sag 4 ruby cookies rack eventmachine

我正在循环中运行一个Sinatra应用程序EventMachine.run,在我的ws.onopen方法中,我希望检查handshake标头的cookie,以确保传入的请求来自我的webapp的注册用户.

我的Sinatra应用包括以下内容:

use Rack::Session::Cookie,  :key => COOKIE_KEY,
                            :path => '/',
                            :expire_after => 2592000, #30 days
                            :secret => COOKIE_SECRET
Run Code Online (Sandbox Code Playgroud)

我的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}"

}
Run Code Online (Sandbox Code Playgroud)

cookie匹配的价值我COOKIE_KEY很好,但值decodednil

我该如何解码传入的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)

}
Run Code Online (Sandbox Code Playgroud)

和那些输出

?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)任何一种方式产生.

所以我觉得我离我更近了,但还没有雪茄.

Dav*_*Sag 6

答案是使用Rack::Utils.unencode.

我现在有这个工作

Marshal.load(rack_cookie.coder.decode(Rack::Utils.unescape(bakesale.split('--').first)))完全解码我需要的哈希,允许我提取用户ID.W00t!

非常感谢用户spastorinohttps://github.com/rack/rack/issues/551指出我正确的方向.