passport.socketio's passport "Failed to deserialize user out of session". But passport in my main app (with the same key) deserializes just fine

StackOverflow https://stackoverflow.com/questions/23492459

Вопрос

passport.socketio throwing this error, while failing to authorize the user.

Error: Error: Failed to deserialize user out of session

I've narrowed the problem down to passport.socketio's /lib/index.js.

At line 59

  auth.passport.deserializeUser(userKey, function(err, user) {
    if (err)
      return auth.fail(data, err, true, accept);
    ...

It throws that error. Debugger tells me the userKey is valid, and should deserialize the user. It's the same key that passport in my main app uses to deserialize the user. (it's the ID of mongoDB object). And passport in my main app has no problem deserializing the user. (details) So don't know why this still throws the error.

The userKey passed here is the same key passport in my main app uses to deserialize.

I've gone to the extent of making the userKey global and putting it in my main code

  passport.deserializeUser(global.userKey, function(err, user) {
    if (err)
      return auth.fail(data, err, true, accept);
    console.log('ok');

Which results in infinite loop (because it's inside outer passport.deserialize) but iut prints 'ok'!, so passport from my main app can atleast deserialize just fine using the same thing that passport from index.js (passport.socketio\lib\index.js) can not! .. for some reason.

Then I've even tried passing the passport object itself from main app

io.set('authorization', require('passport.socketio').authorize({
    passport: passport,
    ...

which actually results in no errors!! but then I don't get the socket.handshake object.

I'm out of ideas to diagnose this any further and would really appreciate any help whatsoever.

What could be causing passport.socketio's passport to not "deserialize user out of session"?

Это было полезно?

Решение

Deleted npm_modules, re-wrote the packages.json with "every_package":"latest", and so basically re-installed every package's latest version. That fixed it.

Другие советы

One problem could be that you have configured your 'passport' instance in the main app to use a specific 'deserializeUser' implementation. look for all the places where your passport has been intiallized in the main app. (If its a framework like mean.io, you will find it in config/passport.js).
Make sure the same initiallization is done to the passport instance in the socket app. Pass it to passportsocketio as such:

passportSocketIo.authorize({
        passport: passport,
        cookieParser: express.cookieParser,
        key: 'connect.sid'
        ...
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top