ループSinatra
内でアプリを実行していますが、メソッドでヘッダーの Cookie をチェックして、着信要求が webapp の登録ユーザーからのものであることを確認したいと考えています。EventMachine.run
ws.onopen
handshake
私の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)
どちらの方法でも結果が変わります。
だから私はもっと近づいた気がしますが、葉巻はまだありません。