2012-12-03 3 views
9

私は、上記の例を使用して対応する問題があります。 は、この例では、セッションが最初にそれをリロードすることでのWebSocketで使用されます。Express SessionIDはCookieのSessionIDと異なります

socket.on('set value', function (val) { 
    sess.reload(function() { 
     sess.value = val; 
     sess.touch().save(); 
    }); 
    }); 

を自分のアプリケーションでそれを使用しようとすると、私は次の例外を取得:

sess.reload(function() { 
    ^
TypeError: Object #<Object> has no method 'reload' 

私はこの問題を考えますそれは誰もセッションとして変数sessを定義していないということです:

io.listen(app).set('authorization', function (data, accept) { 
    if (!data.headers.cookie) 
    return accept('No cookie transmitted.', false); 

    data.cookie = parseCookie(data.headers.cookie); 
    data.sessionID = data.cookie['express.sid']; 

    store.load(data.sessionID, function (err, session) { 
    if (err || !session) return accept('Error', false); 

    data.session = session; 
    return accept(null, true); 
    }); 
}) 

おそらくいくつかはこれに対して短い修正をしていますか?

解決済み:この例は、Express 3.0とRedisでhttps://github.com/DanielBaulig/sioe-demo/blob/master/app.jsを使用しようとしました。

だから代わりMemoryStoreのRedisのストア(接続-Redisの)を作成した:ConnectでparseCookie-メソッドiは

parseCookie = require('cookie').parse 

代わりに

を用いて移動するので

app.use(express.session({cookie: {expires: new Date(Date.now() + 30*60*60*24*1000)}, secret: SESSION_SECRET, key: SESSION_KEY, store: new RedisStore({host:'localhost', port:'6379', client: dbRedis})})); 

connect.utils.parseCookie 

Cookieでセッションにアクセスするには、次のように変更しました。使用して、以下の:N + 57bnkLr + iXkMLbStWdFzK5:

sio.set('authorization', function (data, accept) { 
    if (!data.headers.cookie) 
    return accept('No cookie transmitted.', false); 

    data.cookie = parseCookie(data.headers.cookie); 
    log.info('Cookie: $s', JSON.stringify(data.cookie)); 
    data.sessionID = data.cookie['letter.sid']; 
    log.info('SessionId: %s', data.sessionID); 

    dbRedis.get(data.sessionID, function (err, session) { 
    if (err || !session) return accept('Error ' + session, false); 

    data.session = session; 
    return accept(null, true); 
    }); 
}) 

今私の問題は、セッションIDは、ページ(req.sessionID)私が手にセッションIDを印刷 が異なるので、私はRedisのからセッションをロード傾けること、です明らかにreq.sessionIDがクッキー/ Redisの中に保存されたセッションIDの一部である

[2012-12-03T22:14:56.632Z] INFO: Postbox/78964 on capns-mba.local: Cookie: $s {"SQLiteManager_currentLangue":"4","connect.sid":"s:xvYdDm5C0MEIg53EG8JgqBnM.Tx8+PMKa570zk6qt9vmCjRz2p/LP/COyyqGSm+VKxww","letter.sid":"s:n+57bnkLr+iXkMLbStWdFzK5.XPHh1xXrK9D4cPfJ7HcHO11PKk8FXLg6fIRGaWb/+jI"} 
[2012-12-03T22:14:56.632Z] INFO: Postbox/78964 on capns-mba.local: SessionId: s:n+57bnkLr+iXkMLbStWdFzK5.XPHh1xXrK9D4cPfJ7HcHO11PKk8FXLg6fIRGaWb/+jI 

- しかし、なぜ: しかし、Redisの中に以下のIDが格納されていますか?そして、正しいセッションIDは何ですか?

+0

私はdbRedis.get()を使用してセッションを取得できないという問題があります。 – Markus

答えて

15

session middleware(ライン267)からのコードのこの部分を見:signature.sign関数は連結が(擬似コード)である

var val = 's:' + signature.sign(req.sessionID, secret); 

req.sessionID + "." + hash(secret) 

hashカスタム関数です( see this for more details)。

これは、クッキーの署名規則にすぎないことを意味します(より安全にするため)。

var signature = require("cookie-signature"), 
    prefix = "s:"; 

var real_sid = sid.replace(prefix, ""); 
real_sid = signature.unsign(real_sid, SESSION_SECRET); 
+0

私の問題を完全に解決していただきありがとうございます – Markus

+1

あなたがこれに答えてから数年後、今日、あなたは人生を救いました。ありがとうございました! :) – geevee

+0

私の場合、私はsid = decodeURIComponent(sid)をしなければならなかった。まず、セッションIDがクッキーのエンコードされた文字列に格納されるためです。 –

関連する問題