13

在 node.js 和 express 中,有很多例子展示了如何获取会话数据。

正如您在访问第三个链接时所看到的,它是指向 StackOverflow 的链接。有一个很好的答案,但正如@UpTheCreek 在这些评论中指出的那样,connect 不再具有 parseCookie 方法。我也遇到了这个问题。我发现的所有教程都使用parseCookie了现在不存在的 connect 方法。所以我问他我们如何获得会话数据,他说他不知道最好的方法,所以我想我会在这里发布问题。使用express@3.0.0rc4, socket.io, 和redis时,我们如何获取会话数据并使用它来授权用户?我已经能够使用require('connect').utils.parseSignedCookie;,但是当我这样做时,握手时总是会收到警告/错误,

warn - handshake error Error

从我读过的内容来看,这听起来无论如何都不是一个永久的解决方案。


更新

好的,我开始session.socket.io在我的服务器上工作。正如我所怀疑的那样,我被困在了授权点。我想我可能会以错误的方式解决这个问题,所以请随时纠正我。在我的 Redis 数据库中,我将拥有用户的信息。他们第一次登录时,我想更新他们的 cookie,以便它包含他们的用户信息。然后下次他们回到网站时,我想检查他们是否有 cookie 以及用户信息是否存在。如果它不存在,我想将它们发送到登录屏幕。在登录屏幕上,当用户提交信息时,它会根据 Redis 数据库测试该信息,如果匹配,它将使用用户信息更新 cookie。我的问题是:

1) 如何通过 RedisStore 更新/更改 cookie?

2) 看起来会话数据只保存在 cookie 中。如果有人关闭了 cookie,我如何逐页跟踪用户信息?

这是我的适用代码:

//...hiding unapplicable code...
var redis = require('socket.io/node_modules/redis');
var client = redis.createClient();
var RedisStore = require('connect-redis')(express);
var redis_store = new RedisStore();
var cookieParser = express.cookieParser('secret');

app.configure(function(){
  //...hiding unapplicable code...
  app.use(cookieParser);
  app.use(express.session({secret: 'secret', store: redis_store}));
});

//...hiding code that starts the server and socket.io

var SessionSockets = require('session.socket.io');
var ssockets = new SessionSockets(io, redis_store, cookieParser);

io.configure(function(){
  io.set('authorization', function(handshake, callback){
    if(handshake.headers.cookie){
      //var cookie = parseCookie(handshake.headers.cookie);
      //if(cookie.user){
      //  handshake.user = cookie.user;
      //}
    }
    callback(null, true);
  });
});

ssockets.on('connection', function(err, socket, session){ ... });
4

4 回答 4

6

看看 socket.io 的wiki。特别是配置 Socket.IOAuthorization and handshaking部分。

它展示了如何将 socket.io 与 a 一起使用,RedisStore并提供了两种不同的授权方法。

有关连接 express v3、redis 和 socket.io 的更多信息

于 2012-10-11T14:27:35.530 回答
4

切换到session.socket.io一段时间后,由于加载会话信息时模块的异步特性,我遇到了一些问题。所以我最终创建了自己的名为session.io的模块。它是这样使用的:

var express = require('express');
var app = express();
var server = require('http').createServer(app);

//Setup cookie and session handlers
//Note: for sessionStore you can use any sessionStore module that has the .load() function
//but I personally use the module 'sessionstore' to handle my sessionStores.
var cookieParser = express.cookieParser('secret');
var sessionStore = require('sessionstore').createSessionStore();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  //...truncate...//
  app.use(cookieParser);
  //make sure to use the same secret as you specified in your cookieParser
  app.use(express.session({secret: 'secret', store: sessionStore}));
  app.use(app.router);
});

app.get('/', function(req, res){
  res.send('<script src="/socket.io/socket.io.js"></script><script>io.connect();</script>Connected');
});

server.listen(app.get('port'), function(){
  console.log('Listening on port ' + app.get('port'));
});

var io = require('socket.io').listen(server);

io.configure(function(){
  //use session.io to get our session data
  io.set('authorization', require('session.io')(cookieParser, sessionStore));
});

io.on('connection', function(socket){
  //we now have access to our session data like so
  var session = socket.handshake.session;
  console.log(session);
});
于 2013-03-27T21:29:50.807 回答
2

你的问题:

  1. 如何通过 RedisStore 更新/更改 cookie?
  2. 看起来会话数据仅保存在 cookie 中。如果有人关闭了 cookie,我如何逐页跟踪用户信息?

Cookies / Sessions / RedisStore 想法:

  1. 通常,您只有一个 cookie,即会话 ID
  2. 所有用户状态都存储在服务器上的“会话”中,可以通过会话 ID 找到
  3. 您可以使用 Redis 作为会话数据的后端存储。
  4. Redis 将允许您保持会话状态,即使您的服务器重新启动(好事)
  5. 您可以在会话中存储大量数据(req.session.key = value)
  6. 会话中存储的所有数据都将保持不变,直到用户注销或会话过期

示例 node.js 代码:

var app = express.createServer(
  express.static(__dirname + '/public', { maxAge: 31557600000 }),
  express.cookieParser(),
    express.session({ secret: 'secret', store: new RedisStore({
          host: 'myredishost',
          port: 'port',
          pass: 'myredispass',
          db: 'dbname',
      }, cookie: { maxAge: 600000 })})
);

会话和 Cookie 的想法:

  1. 您的第二个问题是关于没有 cookie 的会话。这个有可能。
  2. 基本上,您将会话 ID 放在您发送到服务器的每个请求的 url 上。
  3. 我坚信大多数人都允许使用 cookie。
  4. 如果这是一个要求,谷歌:“没有 cookie 的会话”
于 2012-10-16T21:11:51.350 回答
-2

会话数据可用于:

req.session
于 2012-10-09T17:49:09.383 回答