Node.js 使用Passport.SocketIO cookie分析器时出错

Node.js 使用Passport.SocketIO cookie分析器时出错,node.js,authentication,express,socket.io,passport.js,Node.js,Authentication,Express,Socket.io,Passport.js,我正在使用以下工具: "dependencies": { "express": "^4.0.0", "socket.io": "0.9.16", "mongoose": "^3.8.8", "passport": "^0.2.0", "passport-local": "^1.0.0", "express-session": "^1.0.3", "cookie-parser": "^1.0.1", "body-parser": "^

我正在使用以下工具:

"dependencies": {
    "express": "^4.0.0",
    "socket.io": "0.9.16",
    "mongoose": "^3.8.8",
    "passport": "^0.2.0",
    "passport-local": "^1.0.0",
    "express-session": "^1.0.3",
    "cookie-parser": "^1.0.1",
    "body-parser": "^1.0.2",
    "session-mongoose": "git://github.com/danpe/session-mongoose.git#master",
    "passport.socketio": "^3.0.1"
  }
S:\Server\node_modules\cookie-parser\index.js:27
    var cookies = req.headers.cookie;
                             ^
TypeError: Cannot read property 'cookie' of undefined 
    at Object.cookieParser(S:\Server\node_modules\cookie-parser\index.js:27:30)
    at parseCookie (S:\Server\node_modules\passport.socketio\lib\index.js:4:27)
    at Manager.<anonymous> (S:\Server\node_modules\passport.socketio\lib\index.js:37:19)
    at Manager.authorize (S:\Server\node_modules\socket.io\lib\manager.js:910:31)
    at Manager.handleHandshake (S:\Server\node_modules\socket.io\lib\manager.js:786:8)
    at Manager.handleRequest (S:\Server\node_modules\socket.io\lib\manager.js:593:12)
    at Server.<anonymous> (S:\Server\node_modules\socket.io\lib\manager.js:119:10)
    at Server.EventEmitter.emit (events.js:98:17)
    at HTTPParser.parser.onIncoming (http.js:2108:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)
设置my socket.io授权:

io.set("authorization", passportSocketIo.authorize({
    passport : passport,
    cookieParser: cookieParser(),
    key:    settings.sessionKey,  //the cookie where express (or connect) stores its session id.
    secret: settings.sessionSecret,       //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);
    }
}));
当我尝试与我的客户联系时:

var socket = io.connect('http://127.0.0.1:3000/');
socket.on('connect', function () {
    // socket connected
    console.log("Socket Connected!");
});
服务器崩溃,原因如下:

"dependencies": {
    "express": "^4.0.0",
    "socket.io": "0.9.16",
    "mongoose": "^3.8.8",
    "passport": "^0.2.0",
    "passport-local": "^1.0.0",
    "express-session": "^1.0.3",
    "cookie-parser": "^1.0.1",
    "body-parser": "^1.0.2",
    "session-mongoose": "git://github.com/danpe/session-mongoose.git#master",
    "passport.socketio": "^3.0.1"
  }
S:\Server\node_modules\cookie-parser\index.js:27
    var cookies = req.headers.cookie;
                             ^
TypeError: Cannot read property 'cookie' of undefined 
    at Object.cookieParser(S:\Server\node_modules\cookie-parser\index.js:27:30)
    at parseCookie (S:\Server\node_modules\passport.socketio\lib\index.js:4:27)
    at Manager.<anonymous> (S:\Server\node_modules\passport.socketio\lib\index.js:37:19)
    at Manager.authorize (S:\Server\node_modules\socket.io\lib\manager.js:910:31)
    at Manager.handleHandshake (S:\Server\node_modules\socket.io\lib\manager.js:786:8)
    at Manager.handleRequest (S:\Server\node_modules\socket.io\lib\manager.js:593:12)
    at Server.<anonymous> (S:\Server\node_modules\socket.io\lib\manager.js:119:10)
    at Server.EventEmitter.emit (events.js:98:17)
    at HTTPParser.parser.onIncoming (http.js:2108:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)
S:\Server\node\u modules\cookie parser\index.js:27
var cookies=req.headers.cookie;
^
TypeError:无法读取未定义的属性“cookie”
位于Object.cookieParser(S:\Server\node\u modules\cookie parser\index.js:27:30)
在parseCookie(S:\Server\node\u modules\passport.socketio\lib\index.js:4:27)
在经理那儿。(S:\Server\node\u modules\passport.socketio\lib\index.js:37:19)
在Manager.authorize(S:\Server\node\u modules\socket.io\lib\Manager.js:910:31)
在Manager.handleHandshake(S:\Server\node\u modules\socket.io\lib\Manager.js:786:8)
位于Manager.handleRequest(S:\Server\node\u modules\socket.io\lib\Manager.js:593:12)
在服务器上。(S:\Server\node\u modules\socket.io\lib\manager.js:119:10)
在Server.EventEmitter.emit上(events.js:98:17)
在HTTPParser.parser.onIncoming(http.js:2108:12)
在HTTPParser.parserOnHeadersComplete[作为onHeadersComplete](http.js:121:23)

你知道怎么会这样吗?

嗨,我也有同样的问题

这是非常合乎逻辑的,因为您正在向cookie解析器传递套接字而不是请求。只需将
socket.request
传递给cookie解析器,它就应该得到修复

可在此处找到解决方案:

编辑:

找到一个有趣的模块套接字.io捆绑包


除了cookie解析器包装器外,它还有一个用于express会话和csurf模块的包装器。

这是一个愚蠢的错误,我应该将cookie解析器作为库而不是实例化对象传递:

var cookieParser= require('cookie-parser');

io.set("authorization", passportSocketIo.authorize({
    passport : passport,
    cookieParser: cookieParser,
    key:    settings.sessionKey,  //the cookie where express (or connect) stores its session id.
    secret: settings.sessionSecret,       //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);
    }
}));

Express 4.x没有headers属性。标题通过req.get检索,cookies位于req.cookies上。我猜cookieParser需要headers属性,所以最简单的选择可能是返回到Express3.x@aembke我正在使用最新的CookieParser,它支持Express4.x代码:
if(req.cookies)return next()
是cookieParserhmm中的第一行,奇数。那么req.headers行从何而来?无论哪个模块尝试引用该属性,都需要为express 4.x进行修补。它可能是passport.socketio?@aembke Line 27有趣的是,我不确定最简单的解决方法是什么,但无论如何,您需要该模块不要尝试使用headers属性。如果cookie解析器的维护人员相对活跃,那么应该联系他们,为Express4.x修补代码。否则,您可以自己修补它并提交拉取请求?我相信您不是第一个或最后一个希望将cookie解析器与express 4.x.Hi Danpe一起使用的人,顺便说一句,最新版本的socket.io不推荐使用cookie解析器。use
io.use(函数(socket,next){next();})取而代之。:)谢谢,但我使用的是0.9.16,在移植1.0.0以支持时遇到问题。如何使用此包装器?我把它放在
cookieParser:cookieParserWrapper(),
的位置,但它给出了相同的错误…如果使用上面的代码,只需使用
io.use(cookieParserWrapper)不带括号。