13

与えられた例を使用して、対応する問題があります。この例では、セッションは最初にリロードすることでWebSocketで使用されます。

  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);
  });
})

たぶん、これに対する短い修正がある人がいますか?

問題の解決:次の例を使用しようとしました:https ://github.com/DanielBaulig/sioe-demo/blob/master/app.js withExpress3.0およびRedis。

したがって、MemoryStoreの代わりにRedisストア(connect-redis)を作成しました。

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})}));

parseCookie-接続のメソッドが移動したので、私は使用しました

parseCookie = require('cookie').parse

それ以外の

connect.utils.parseCookie

Cookie内のセッションにアクセスするために、次を使用して例を変更しました。

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が異なるためにRedisからセッションをロードできないことです。ページ(req.sessionID)にセッションIDを印刷すると、次のようになります。n + 57bnkLr + iXkMLbStWdFzK5しかし、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

明らかに、req.sessionIDはcookie / redisに保存されたSessionIDの一部ですが、なぜですか?そして、正しいセッションIDはどれですか?

4

1 に答える 1

21

セッション ミドルウェアからのこのコードを見てください(行 267 ):

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

ここで、signature.sign関数は連結です (疑似コード):

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

hashカスタム関数です (詳細については、こちらを参照してください)。

これは、Cookie の署名規則にすぎないことを意味します (より安全にするため)。次のように呼び出して、sid を取得できます。

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

var real_sid = sid.replace( prefix, "" );
real_sid = signature.unsign( real_sid, SESSION_SECRET );
于 2012-12-03T23:00:56.380 に答える