Express 3 http://notjustburritos.tumblr.com/post/22682186189/socket-io-and-express-3でこれに似た手法で良いスタートを切りました
アイデアは、socket.io 接続コールバック内からセッション オブジェクトを取得できるようにすることでありconnect-redis
、この場合はセッションを保存します。
だから、app.configure
私たちは持っています
var db = require('connect-redis')(express)
....
app.configure(function(){
....
app.use(express.cookieParser(SITE_SECRET));
app.use(express.session({ store: new db }));
そして、アプリコードには
var redis_client = require('redis').createClient()
io.set('authorization', function(data, accept) {
if (!data.headers.cookie) {
return accept('Sesssion cookie required.', false)
}
data.cookie = require('cookie').parse(data.headers.cookie);
/* verify the signature of the session cookie. */
//data.cookie = require('cookie').parse(data.cookie, SITE_SECRET);
data.sessionID = data.cookie['connect.sid']
redis_client.get(data.sessionID, function(err, session) {
if (err) {
return accept('Error in session store.', false)
} else if (!session) {
return accept('Session not found.', false)
}
// success! we're authenticated with a known session.
data.session = session
return accept(null, true)
})
})
セッションは redis に保存され、キーは次のようになります。
redis 127.0.0.1:6379> KEYS *
1) "sess:lpeNPnHmQ2f442rE87Y6X28C"
2) "sess:qsWvzubzparNHNoPyNN/CdVw"
値は暗号化されていない JSON です。ここまでは順調ですね。
ただし、Cookieヘッダーには次のようなものが含まれています
{ 'connect.sid': 's:lpeNPnHmQ2f442rE87Y6X28C.obCv2x2NT05ieqkmzHnE0VZKDNnqGkcxeQAEVoeoeiU' }
したがって、SessionStore と はconnect.sid
一致しません。これは、署名部分 ( の後の部分.
) が SessionStore バージョンから取り除かれているためです。
質問は、Cookie の SID 部分 (lpeNPnHmQ2f442rE87Y6X28C) を切り捨ててそれに基づいて一致させるだけで安全ですか、それとも署名部分を検証する必要がありますか? もしそうなら、どのように?