首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Passport.SocketIO cookie解析器错误

使用Passport.SocketIO cookie解析器错误
EN

Stack Overflow用户
提问于 2014-04-25 20:34:53
回答 2查看 2.4K关注 0票数 3

我使用的方法如下:

代码语言:javascript
复制
"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"
  }

设置我的socket.io授权:

代码语言:javascript
复制
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);
    }
}));

当我试图和我的客户联系时:

代码语言:javascript
复制
var socket = io.connect('http://127.0.0.1:3000/');
socket.on('connect', function () {
    // socket connected
    console.log("Socket Connected!");
});

服务器崩溃的情况如下:

代码语言:javascript
复制
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)

知道怎么会发生这种事吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-25 22:38:13

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

代码语言:javascript
复制
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);
    }
}));
票数 7
EN

Stack Overflow用户

发布于 2014-04-25 22:33:40

嗨,我也有同样的问题。

这很符合逻辑,因为您将一个套接字而不是请求传递给cookie解析器。只需将socket.request传递给cookie解析器,它就应该被修复。

可以在这里找到解决方案:https://github.com/expressjs/cookie-parser/issues/3#issuecomment-41443866

代码语言:javascript
复制
var cookieParser = require('cookie-parser')(SESSION_SECRET);    

// ### Cookie parser

// Wrapper arround Express cookie parser, so we can use the same cookie parser for socket.io.
// Parse Cookie header and populate `socket.request.cookies` with an object keyed by the cookie names.
// Uses signed cookies by passing a secret string, which assigns `socket.request.secret` so it may be used by other middleware.

function cookieParserWrapper (socket, next) {
  // request, response and callback
  cookieParser(socket.request, {}, next);
}

编辑:

找到了一个有趣的模块socket.io-bundlehttps://github.com/nkzawa/socket.io-bundle/blob/master/lib/cookieParser.js

除了cookie-解析器包装器之外,它还有一个用于快速会话和c冲浪模块的包装器。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23302542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档