PassportJS 会话混淆
PassportJS Session Mixed Up
在我们的 ExpressJS 应用程序中,当推送到生产服务器时,护照会话会随机混淆。随机地,即使我没有退出我的会话,该页面也可以加载另一个用户的视图。不执行任何其他操作,再次刷新将使我回到我自己的帐户(也是随机的)。
我们的两个 Web 应用程序正在发生这种现象,这些应用程序由两个不同的用户按照其网站上的 Passport 指南进行编码。两个网络应用程序都使用 Facebook connect/API.
这发生在 Redis 和文件会话存储上。我看到 a post about using global variables:我们确定我们只使用本地范围。
我们做错了什么吗?
更新 v1
在一个应用程序中,我们为 Passport 的 serialize/deserialize 实现了以下内容:
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
其他的,我们也试过了:
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
User
.where({id: user.id})
.fetch()
.then(function (user) {
done(null, user);
}, function (err) {
done(err, user);
});
});
无论哪种方式,应用程序的会话仍然混乱。
更新 v2
只有当多个用户登录到服务器并同时使用时才会出现此错误。只有1个人使用系统时不会出现。
更新 v3
看来这个问题可能是由亚马逊 AWS 引起的,因为一些“错误的用户”页面请求根本没有到达 NodeJS 应用程序(由 console.log
验证)。
问题似乎是由 ExpressJS 而不是 PassportJS 会话引起的缓存。
我们发现 ExpressJS 在生产环境中将设置 view cache
设置为 true。通过在 app.js 中使用 app.disable('view cache');
,我们禁用了缓存,似乎已经解决了问题。
在我们的 ExpressJS 应用程序中,当推送到生产服务器时,护照会话会随机混淆。随机地,即使我没有退出我的会话,该页面也可以加载另一个用户的视图。不执行任何其他操作,再次刷新将使我回到我自己的帐户(也是随机的)。
我们的两个 Web 应用程序正在发生这种现象,这些应用程序由两个不同的用户按照其网站上的 Passport 指南进行编码。两个网络应用程序都使用 Facebook connect/API.
这发生在 Redis 和文件会话存储上。我看到 a post about using global variables:我们确定我们只使用本地范围。
我们做错了什么吗?
更新 v1
在一个应用程序中,我们为 Passport 的 serialize/deserialize 实现了以下内容:
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
其他的,我们也试过了:
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
User
.where({id: user.id})
.fetch()
.then(function (user) {
done(null, user);
}, function (err) {
done(err, user);
});
});
无论哪种方式,应用程序的会话仍然混乱。
更新 v2 只有当多个用户登录到服务器并同时使用时才会出现此错误。只有1个人使用系统时不会出现。
更新 v3
看来这个问题可能是由亚马逊 AWS 引起的,因为一些“错误的用户”页面请求根本没有到达 NodeJS 应用程序(由 console.log
验证)。
问题似乎是由 ExpressJS 而不是 PassportJS 会话引起的缓存。
我们发现 ExpressJS 在生产环境中将设置 view cache
设置为 true。通过在 app.js 中使用 app.disable('view cache');
,我们禁用了缓存,似乎已经解决了问题。