5

ループSinatra内でアプリを実行していますが、メソッドでヘッダーの Cookie をチェックして、着信要求が webapp の登録ユーザーからのものであることを確認したいと考えています。EventMachine.runws.onopenhandshake

私の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しますが、 の値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)

}

そしてそれは出力します

?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)どちらの方法でも結果が変わります。

だから私はもっと近づいた気がしますが、葉巻はまだありません。

4

1 に答える 1

7

答えは、使用することRack::Utils.unencodeです。

私は今これが機能しています

Marshal.load(rack_cookie.coder.decode(Rack::Utils.unescape(bakesale.split('--').first)))必要なハッシュに完全にデコードされ、ユーザー ID を抽出できます。ワーッ!

私を正しい方向に向けてくれたhttps://github.com/rack/rack/issues/551のユーザーspastorinoに感謝します。

于 2013-05-04T01:13:17.243 に答える