首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Socket.io,Passport,MongoDB & passport.socketio在生产中被打破

Socket.io,Passport,MongoDB & passport.socketio在生产中被打破
EN

Stack Overflow用户
提问于 2014-02-05 11:58:31
回答 1查看 1.1K关注 0票数 2

我在socket.io上构建了一个nodejs应用程序,使用Passport & passport.socketio进行身份验证和授权,使用mongodb进行会话存储。

它在我的笔记本电脑上运行得很好,但是当我移动到Cloud (Azure-VM)时,我开始发现一些奇怪的错误。

05-02-2014,11:47:06.500收听端口8081 (https)

代码语言:javascript
复制
/home/azureuser/myapp/node_modules/mongodb/lib/mongodb/connection/base.js:242
    throw message;      
          ^
Error: Error in session store:
Error: failed to deserialize user out of session
    at Object.io.set.passportSocketIo.authorize.fail     (/home/azureuser/myapp/lib/express/socketio.js:25:23)
    at /home/azureuser/myapp/node_modules/passport.socketio/lib/index.js:48:21
    at /home/azureuser/myapp/node_modules/connect-mongo/lib/connect-mongo.js:229:23
    at /home/azureuser/myapp/node_modules/mongodb/lib/mongodb/collection/query.js:147:5
    at Cursor.nextObject (/home/azureuser/myapp/node_modules/mongodb/lib/mongodb/cursor.js:733:5)
    at commandHandler (/home/azureuser/myapp/node_modules/mongodb/lib/mongodb/cursor.js:713:14)
    at /home/azureuser/myapp/node_modules/mongodb/lib/mongodb/db.js:1806:9
    at Server.Base._callHandler (/home/azureuser/myapp/node_modules/mongodb/lib/mongodb/connection/base.js:442:41)
    at /home/azureuser/myapp/node_modules/mongodb/lib/mongodb/connection/server.js:485:18
    at MongoReply.parseBody (/home/azureuser/myapp/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5)

知道从哪里开始吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-05 16:13:39

好的,我找到了,passport.socketio依赖于护照,并且有自己的护照“版本”。这意味着在我的代码中,当我设置serializeUser/deserializeUser时,它只影响我为其余部分使用的护照:

代码语言:javascript
复制
passport.serializeUser(function(user, done) {
    done(null, user);
});
passport.deserializeUser(function(id, done) {
    done(null, id);
}); 

而passport.socketio默认情况下是这样的:

代码语言:javascript
复制
var defaults = {
  passport:     require('passport'),
  key:          'connect.sid',
  secret:       null,
  ...
};

这意味着不使用序列化用户/反序列化用户,这反过来会导致以下情况:

代码语言:javascript
复制
Error: failed to deserialize user out of session

解决方案非常简单,只需将其余的护照传递给passport.socketio

代码语言:javascript
复制
io.set('authorization', passportSocketIo.authorize({
    passport : passport,
    cookieParser: express.cookieParser,
    ...
 }));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21576631

复制
相关文章

相似问题

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