簡體   English   中英

Socket.io,Passport,MongoDB和password.socketio在生產中損壞

[英]Socket.io, Passport, MongoDB & passport.socketio broken in production

我建立了一個在socket.io上中繼的nodejs應用程序,使用Passport和passport.socketio進行身份驗證和授權,使用mongodb和connect-mongo進行會話存儲。

它可以在筆記本電腦上很好地工作,但是當我移到雲(Azure-VM)時,我開始遇到奇怪的錯誤。

2014年5月2日,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)

任何想法從哪里開始?

好的,我發現了,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的護照傳遞給password.socketio

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM