2

私は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)

どこから始めればよいですか?

4

1 に答える 1

3

わかりました。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-05T16:13:39.050 に答える