我正在使用以下模块处理NodeJ:
表示4.9.8
express-session 1.9.3
socket.io 1.2.1
session.socket.io-express4 0.0.3
我正在尝试使用以下代码从app.js中的session.socket.io-express4获取会话:
首先是app.js中所有东西的初始化:
var server = app.listen(3000, function() {
debug('Express server listening on port ' + server.address().port);
});
var io = require('socket.io')(server);
var sessionstore = require('sessionstore');
var sessionStore = sessionstore.createSessionStore();
var cookieParserVar = cookieParser('bingo');
app.use(session({
secret: 'bingo',
cookie: {httpOnly: true, secure: true, maxAge: new Date(Date.now() + 3600000)},
store: sessionStore,
resave: true,
saveUninitialized: true
}));
var SessionSockets = require('session.socket.io-express4');
sessionSockets = new SessionSockets(io, sessionStore, cookieParserVar);
require('./models/socket.js')(sessionSockets);
我的socket.js:
function handleSocket(sessionSockets) {
sessionSockets.on('connection', function (err, socket, session) {
console.log("session : " + session);
});
}
module.exports = handleSocket;
问题是会话未定义。有任何想法吗 ?
所以我尝试使用socket.io-sessions代替。
这是我的代码:
var sessionstore = require('sessionstore');
var sessionStore = sessionstore.createSessionStore();
var cookieParserVar = cookieParser();
app.use(session({
secret: 'bingo',
key: 'express.sid',
store: sessionStore,
resave: true,
saveUninitialized: true
}));
io.set("authorization", socketIoSessions({
key: 'express.sid', //the cookie where express (or connect) stores its session id.
secret: 'bingo', //the session secret to parse the cookie
store: sessionStore //the session store that express uses
}));
require('./models/socket.js')(io);
我的models / socket.js文件包括:
function handleSocket(sock) {
sock.on('connection',function(socket)
{
socket.handshake.getSession(function (err, session) {
console.log("HERHERHEHREHREHRHEHERHERHRHERHERHEHREHREHREHR");
console.log(session);
console.log(err);
});
require('../commands/echo.js')(sock);
});
}
module.exports = handleSocket;
这是我得到的错误:
/mnt/storage/home/ufk/work-projects/bingo/server/bingo-server/models/socket.js:8
socket.handshake.getSession(function (err, session) {
^
TypeError: Object #<Object> has no method 'getSession'
at Namespace.<anonymous> (/mnt/storage/home/ufk/work-projects/bingo/server/bingo-server/models/socket.js:8:34)
at Namespace.emit (events.js:95:17)
at Namespace.emit (/mnt/storage/home/ufk/work-projects/bingo/server/bingo-server/node_modules/socket.io/lib/namespace.js:205:10)
at /mnt/storage/home/ufk/work-projects/bingo/server/bingo-server/node_modules/socket.io/lib/namespace.js:172:14
at process._tickCallback (node.js:419:13)
我错过了什么?
socket.io-session按预期工作。 我需要更改的唯一事情是授权回调,以便它与socket.io-1.0兼容我执行了以下操作:
io.use(function (socket, next) {
var handshakeData = socket.handshake;
ioSession(cookieParser(config.app.session_key), sessionStore)(handshakeData, next);
}
);
答案 0 :(得分:3)
原始答案中对问题的解释仍然是相关的,但修复更简单(更安全)。只需使用socket.io-session。 session.socket.io-express4模块仅在您使用cookieParser的连接版本时才有必要,该版本没有与较新的cookie-parser相同的签名处理。
这是因为当使用cookie-parser秘密和快速会话密钥时,sesssion.socket.io-express4中存在一个错误。 sesssion.socket.io-express4正在尝试剥离connect.sid cookie的签名。您可以看到here:
if(handshake.cookies && handshake.cookies[key]) handshake.cookies[key] = (handshake.cookies[key].match(/\:(.*)\./) || []).pop();
签名后的Cookie看起来像s:<value>.<signature>
,正则表达式会选择:
和.
之间的任何内容,这将是签名Cookie的值。问题是,如果你传入一个秘密,cookie-parser将删除签名本身。这意味着session.socket.io-express4期待s:<value>.<signature>
但正在接收<value>
,因此正则表达式返回undefined。要解决这个问题,你可以省略cookie-parser的秘密。
我已经提交了pull request to session.socket.io-express4并修复了此错误,因此您必须使用与快速会话具有相同秘密的Cookie解析器。
不要为cookie解析器提供秘密。以下应该按预期工作:
var server = app.listen(3000, function() {
debug('Express server listening on port ' + server.address().port);
});
var io = require('socket.io')(server);
var sessionstore = require('sessionstore');
var sessionStore = sessionstore.createSessionStore();
var cookieParserVar = cookieParser();
app.use(session({
secret: 'bingo',
store: sessionStore,
resave: true,
saveUninitialized: true
}));
var SessionSockets = require('session.socket.io-express4');
sessionSockets = new SessionSockets(io, sessionStore, cookieParserVar);
require('./models/socket.js')(sessionSockets);