2012-01-19 46 views
8

セッションデータを取得するためにSocket.IOの認証機能を使用しようとしています。問題は、私がログアウトしてセッションを破棄しても、Socket.IOにはまだ明らかに理想的ではない古いセッション情報が残っていることです。私は下のコードで間違って何をしているすべてのアイデア?Socket.io認証機能がセッションデータを更新していません

io.set('authorization', function (data, accept) { 
    if(data.headers.cookie) { 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
     app.set('mongo-store').get(data.sessionID, function (err, session) { 
      console.log(err, session); 
     if (err || !session) { 
       // if we cannot grab a session, turn down the connection 
       accept('Error', false); 
     } else { 
     // save the session data and accept the connection 
     data.session = session; 
     accept(null, true); 
     } 
     }); 
    } else { 
     return accept('No cookie transmitted.', false); 
    } 
    accept(null, true); 
}); 

そしてここで、接続コードです:http://www.danielbaulig.de/socket-ioexpress/から

io.sockets.on('connection', function(socket) { 

    var hs = socket.handshake; 
    console.log('A socket with sessionID ' + hs.sessionID 
     + ' connected!'); 
    // setup an inteval that will keep our session fresh 
    var intervalID = setInterval(function() { 
     // reload the session (just in case something changed, 
     // we don't want to override anything, but the age) 
     // reloading will also ensure we keep an up2date copy 
     // of the session with our connection. 
     hs.session.reload(function() { 
      // "touch" it (resetting maxAge and lastAccess) 
      // and save it back again. 
      hs.session.touch().save(); 
     }); 
    }, 60 * 1000); 
    socket.on('disconnect', function() { 
     console.log('A socket with sessionID ' + hs.sessionID 
      + ' disconnected!'); 
     // clear the socket interval to stop refreshing the session 
     clearInterval(intervalID); 
    }); 
}); 
+0

+1私は同じ問題を抱えています。クライアントのセッションCookieが期限切れになったり削除されたりしても、Socket.IO接続は引き続き古いデータにアクセスでき、セッションはまだアクティブであると見なされます。 – dbau

答えて

4

sio.sockets.on('connection', function (socket) { 
    var hs = socket.handshake; 
    console.log('A socket with sessionID ' + hs.sessionID 
     + ' connected!'); 
    // setup an inteval that will keep our session fresh 
    var intervalID = setInterval(function() { 
     // reload the session (just in case something changed, 
     // we don't want to override anything, but the age) 
     // reloading will also ensure we keep an up2date copy 
     // of the session with our connection. 
     hs.session.reload(function() { 
      // "touch" it (resetting maxAge and lastAccess) 
      // and save it back again. 
      hs.session.touch().save(); 
     }); 
    }, 60 * 1000); 
    socket.on('disconnect', function() { 
     console.log('A socket with sessionID ' + hs.sessionID 
      + ' disconnected!'); 
     // clear the socket interval to stop refreshing the session 
     clearInterval(intervalID); 
    }); 

}); 

編集:認証コード

io.set('authorization', function (handshakeData, callback) { 
    var cookie; 
    // console.log(handshakeData.headers); 
    if (handshakeData.headers && handshakeData.headers.cookie) { 
    cookie = parseCookie(handshakeData.headers.cookie); 
    // where SessionStore is an instance of your mongo store 
    SessionStore.load(cookie['sioapp.sid'], function (err, session) { 
     if (err) { 
     // if we cannot grab a session, turn down the connection 
     console.log(err); 
     } else { 
     // console.log('Successfully decoded the session: ', session); 
     handshakeData.session = session; 
     } 
    }); 
    } 
    callback(null, true); // error first callback style 
}); 

は60秒ごとに一度、セッションがタッチされます(したがって、リフレッシュed)。ユーザーが切断すると、セッションは破棄されます。

+0

同じ記事のコードを使用しています。私はページ上で見つかった認証コードを使用していますが、私の問題は 'sessionID'(' hs.sessionID'で使われている)が正しくないか、ソケットセッションとExpressセッションストアの関係が単純であることです期待どおりに動作しません。 –

+0

コード全体をペーストしてください。たぶんあなたは誤字があります。 – alessioalex

+0

すべてのコードを更新しました。 –

0

私は、60 * 1000が60万を意味するかどうかはわかりません。私はそれが1億円だと言うでしょう。

+0

ミリ秒です。 1000 ms * 60は60秒です。 –

関連する問題