1

socket.io 内のセッション変数にアクセスするという悪名高い問題を解決しようとしています。基本的に、このトピックに関する Google のすべてのリンクを読みましたが、まだ苦労しています。

すべてのルーティングの後、私はこれを持っています:

io.set('authorization', function(data,accept)
{
    data.cookie = cookie.parse(data.headers.cookie);
    ---> console.log(data.cookie);
    data.sessionID = connect.utils.parseSignedCookie(data.cookie['express.sid'].split('.')[0].substring(2), conf.sessionSecret);

    sessionStore.get(data.sessionID, function (err, session)
    {
        console.log(session);
    });
});

残念ながら、矢印を描いたconsole.logはこれを返します:

{ 'connect.sid': 's:3pIi31DPthO8KVOjqzYpeL75.nHvKOpMZsUsyto7CtBJgcJZIiBSN+IC2/aD0GcfYftU' }

もちろん、express.sid が未定義であるというエラーが表示されます。Express.sid を connect.sid に変更すると、セッション変数が未定義になります。

私はこの問題を解決するのに本当に苦労しています-私は数時間それに取り組んできました. 何か助けはありますか?

編集:解決した問題を要約するには:

  1. app.config では、セッションの代わりに cookieSession を使用していました
  2. 私のクライアントは、サーバーのポート転送された外部 IP バージョンに接続していました。これは Cookie データを持っていませんでした。
  3. .split('.')[0].substring(2) は、セッションIDを見つけるときに絶対に必要です
  4. io.set('authorization, function (handshake,callback) の最後に ... socket.io 接続が正常に進行するためには、「callback(null,true)」を呼び出す必要があります
4

1 に答える 1

1

あなたはかなり近いです。実際には、パーサーに渡される前に Cookie を変更する必要はありません。

io.set('authorization', function(handshake, callback) {
  handshake.cookie = cookie.parse(handshake.headers.cookie);
  handshake.sessionID = connect.utils.parseSignedCookie(handshake.cookie['express.sid'], conf.sessionSecret);

  sessionStore.get(handshake.sessionID, function(err, session) {
    // the session would be here
  });
});

ただし、Cookie パーサー ミドルウェアにアクセスできるので、個人的には次のようにします。

var parseCookie = express.cookieParser(conf.sessionSecret);
io.set('authorization', function(handshake, callback) {
  if (handshake.headers.cookie) {
    parseCookie(handshake, null, function(err) {
      handshake.sessionID = handshake.signedCookies['express.sid'];
      sessionStore.get(handshake.sessionID, function(err, session) {
        // the session would be here
      });
    });
  }
});

このアプローチは、Cookie の解析中に発生する可能性のあるすべてのエラーを収集し、handshakeオブジェクトを HTTP 要求オブジェクトであるかのように渡すことによって機能しheaders.cookieます。次に、Cookie パーサーが Cookie を解析してhandshakeオブジェクトに割り当てます。これにより、 からセッション ID を見つけることができますhandshake.signedCookies

于 2013-10-23T23:10:30.217 に答える