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}}无法“将用户反序列化为会话”的原因是什么?
答案 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'
...
});