我试图围绕 passport.js ,并确定我没有正确使用它。
特别是serializeUser()
和deserializeUser()
函数。我的功能类似于下面的两个。我基本上是将我的数据库user._id
推送到会话中(我不喜欢这样做),并且可以使用cookie查看器在浏览器中轻松查看。
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
done(null, id);
});
因此,对于每个安全请求,我运行isAuthenticated()
函数检查用户是否使用Passport进行身份验证,然后使用req.user
中的反序列化ID对数据库执行各种CRUD操作。
我想知道的是什么会阻止经过身份验证的用户在会话中将其自己的user._id替换为其他人的user._id,并获得对其他用户的所有这些CRUD数据库操作的访问权限。 / p>
答案 0 :(得分:2)
来自快速会话中间件文档(https://github.com/expressjs/session)
秘密 - 使用此秘密签署会话cookie以防止篡改。
实施例。 app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))
序列化和反序列化逻辑由。提供 应用程序,允许应用程序选择合适的 数据库和/或对象映射器,没有强加的 身份验证层。
因此,您必须实现serializeUser()和deserializeUser()方法。 Serialize方法将返回身份信息以在将来的请求中恢复用户。并且该身份信息将保存在会话中。反序列化方法应该能够基于该身份信息识别用户。无论您使用数据库ID,一些随机生成的字符串,UUID或类似的东西都取决于您和您的安全要求。