与express.js和x2B的会话;passport.js

与express.js和x2B的会话;passport.js,express,socket.io,passport.js,Express,Socket.io,Passport.js,目标 我想做的是: 为用户创建会话 为套接字创建会话(socket.io) 使用passport.js对登录和socket会话进行身份验证 注释 我已经安装了MongoStore和passport.socket.io npm的。我可以登录并设置登录用户的cookie(connect.sid) 问题 如何设置系统以存储套接字会话并将其与用户的会话耦合 代码 app.js /* The usual express setup */ passport = require('passpo

目标

我想做的是:

  • 为用户创建会话
  • 为套接字创建会话(
    socket.io
  • 使用
    passport.js
    对登录和
    socket
    会话进行身份验证
注释

我已经安装了
MongoStore
passport.socket.io npm的
。我可以登录并设置登录用户的
cookie
connect.sid


问题

如何设置系统以存储
套接字
会话并将其与用户的
会话
耦合


代码

app.js

  /* The usual express setup */
  passport = require('passport'),
  LocalStrategy = require('passport-local').Strategy,
  User = require('./models/user.js'),
  MongoStore = require('connect-mongo')(express);

app.use(express.cookieParser());
  app.use(express.bodyParser());
  app.use(express.session({
    secret: 'chuck norris', 
    store: new MongoStore({db: User.name}, // the db's name
        function(err) {
          console.log(err || 'connect ok!');
        })
  }));
  app.use(express.methodOverride());
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);

app.js(护照部分)


app.js(socket.io部分)


您将新的内存故事对象实例存储到一个变量中,并将其传递给express和socket io,就像这样。 (请注意,我们使用的是不同的商店,但理论上,只要您通过正确的方式控制,您使用的商店就不重要了)

然后在app.configure中配置您

app.use(express.session({store:sessionStore,secret:'secret',key:'express.sid'}));
最后在socket.io中进行配置

io.configure(function (){
io.set("authorization", passportSocketIo.authorize({
    key:    'express.sid',       //the cookie where express (or connect) stores its session id.
    secret: 'secret', //the session secret to parse the cookie
    store:   sessionStore,     //the session store that express uses
    fail: function(data, accept) {
        // console.log("failed");
        // console.log(data);// *optional* callbacks on success or fail
        accept(null, false);             // second param takes boolean on whether or not to allow handshake
    },
    success: function(data, accept) {
      //  console.log("success socket.io auth");
     //   console.log(data);
        accept(null, true);
    }
}));
如果您正确地执行了此操作,并且您的用户成功地进行了身份验证,那么您应该能够访问握手对象上的会话数据

console.log(socket.handshake.user.username);
//or sometimes it might be...
console.log(socket.handshake.user[0].username);

希望有帮助

非常感谢你。还有一件事,当服务器重新启动时,用户会话被删除,页面返回到登录屏幕。当你说另一件事时,你是说你需要我回答为什么你的会话被删除并返回登录???我认为这是正确的行为。重新启动服务器后,它将启动所有新会话。这是因为重新启动后必须重新验证,并且在验证后会生成新的会话id。你是说你想在服务器重启后继续会话吗?我在玩MongoStore时看到,会话一直持续。但在服务器重新启动后重新启动会话是有意义的。谢谢你的帮助,非常感谢!“express.sid”作为会话密钥是约定还是要求?我尝试过其他字符串,但效果很好,所以我想知道为什么会在这么多示例中使用它。
app.use(express.session({store:sessionStore,secret:'secret',key:'express.sid'}));
io.configure(function (){
io.set("authorization", passportSocketIo.authorize({
    key:    'express.sid',       //the cookie where express (or connect) stores its session id.
    secret: 'secret', //the session secret to parse the cookie
    store:   sessionStore,     //the session store that express uses
    fail: function(data, accept) {
        // console.log("failed");
        // console.log(data);// *optional* callbacks on success or fail
        accept(null, false);             // second param takes boolean on whether or not to allow handshake
    },
    success: function(data, accept) {
      //  console.log("success socket.io auth");
     //   console.log(data);
        accept(null, true);
    }
}));
console.log(socket.handshake.user.username);
//or sometimes it might be...
console.log(socket.handshake.user[0].username);