【问题标题】:Socket.io, Passport, MongoDB & passport.socketio broken in productionSocket.io、Passport、MongoDB 和 passport.socketio 在生产中损坏
【发布时间】:2014-03-01 20:20:26
【问题描述】:

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

它在我的笔记本电脑上运行良好,但是当我迁移到云 (Azure-VM) 时,我开始遇到奇怪的错误。

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

/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)

任何想法从哪里开始?

【问题讨论】:

  • mongodb 实例也在 azure 上?

标签: mongodb azure socket.io passport.js passport.socketio


【解决方案1】:

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

passport.serializeUser(function(user, done) {
    done(null, user);
});
passport.deserializeUser(function(id, done) {
    done(null, id);
}); 

虽然 passport.socketio 默认会这样做:

var defaults = {
  passport:     require('passport'),
  key:          'connect.sid',
  secret:       null,
  ...
};

表示未使用 serializeUser/deserializeUser,这反过来又会导致:

Error: failed to deserialize user out of session

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

io.set('authorization', passportSocketIo.authorize({
    passport : passport,
    cookieParser: express.cookieParser,
    ...
 }));

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多