【问题标题】:How to decode a cookie from the header of a websocket connection handshake? (Ruby)如何从 websocket 连接握手的标头中解码 cookie? (红宝石)
【发布时间】: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??????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)

所以我觉得我更接近了,但还没有雪茄。

【问题讨论】:

标签: ruby cookies rack eventmachine


【解决方案1】:

答案是使用Rack::Utils.unencode

我现在有这个工作

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

非常感谢https://github.com/rack/rack/issues/551 的用户 spastorino 为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多