passport.socketio的护照“无法将用户反序列化为会话”。但是我的主应用程序中的护照(使用相同的密钥)反序列化就好了

时间:2014-05-06 10:43:03

标签: deserialization passport.js passport.socketio

passport.socketio抛出此错误,但未授权用户。

  

错误:错误:无法将用户反序列化为会话

我已将问题缩小到passport.socketio的/lib/index.js

第59行

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

它抛出了这个错误。调试器告诉我userKey有效,而应该反序列化用户。我主应用程序中的护照用于反序列化用户的相同密钥。 (它是mongoDB对象的ID)。我的主应用程序中的护照对反序列化用户没有问题。 (details) 所以不知道为什么这仍然会引发错误。

此处传递的userKey与我的主应用程序用于反序列化的密钥护照相同。

我已经将userKey全局化并将其放入我的主要代码中

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

导致无限循环(因为它在外部passport.deserialize内)但是iut打印'ok'!,因此来自我的主应用程序的护照至少可以使用与index.js护照相同的东西进行反序列化(passport.socketio \ lib \ index.js)不行! ......出于某种原因。

然后我甚至尝试从主应用程序传递护照对象

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

实际上没有错误!但后来我没有得到socket.handshake对象。

我没有进一步诊断这一点的想法,并且非常感谢任何帮助。

可能导致passport.socketio的{​​{1}}无法“将用户反序列化为会话”的原因是什么?

2 个答案:

答案 0 :(得分:3)

删除了npm_modules,用"every_package":"latest"重写了packages.json,因此基本上重新安装了每个软件包的最新版本。 That fixed it.

答案 1 :(得分:2)

一个问题可能是您在主应用中配置了“passport”实例以使用特定的“deserializeUser”实现。寻找你的护照在主应用程序中被篡改的所有地方。 (如果它是像mean.io这样的框架,你会在config / passport.js中找到它)。
确保对套接字应用程序中的passport实例执行相同的初始化。将它传递给passportsocketio:

passportSocketIo.authorize({
        passport: passport,
        cookieParser: express.cookieParser,
        key: 'connect.sid'
        ...
});