了解Passport.js - 篡改serializedUser

时间:2014-06-11 13:24:06

标签: node.js passport.js passport-local

我试图围绕 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>

  • 护照是否有某种散列算法来检查序列化数据是否已被篡改?
  • 我的数据库CRUD操作是否应该使用返回的ID?
  • 是否有其他方法可以避免将user._id发送到浏览器?

1 个答案:

答案 0 :(得分:2)

  • 这是会话中间件,可确保会话数据不被篡改,您只需提供将用于签名的秘密选项。

来自快速会话中间件文档(https://github.com/expressjs/session

秘密 - 使用此秘密签署会话cookie以防止篡改。

实施例。 app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))

  

序列化和反序列化逻辑由。提供   应用程序,允许应用程序选择合适的   数据库和/或对象映射器,没有强加的   身份验证层。

因此,您必须实现serializeUser()和deserializeUser()方法。 Serialize方法将返回身份信息以在将来的请求中恢复用户。并且该身份信息将保存在会话中。反序列化方法应该能够基于该身份信息识别用户。无论您使用数据库ID,一些随机生成的字符串,UUID或类似的东西都取决于您和您的安全要求。