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