1

我试图把我的头绕在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 进行了身份验证,然后我使用反序列化的 ID 在req.user数据库上执行各种 CRUD 操作。

我想知道的是什么会阻止经过身份验证的用户在会话中用其他人的 user._id 替换他们自己的 user._id,并获得对不同用户的所有这些 CRUD db 操作的访问权限。

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

1 回答 1

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

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

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

前任。app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))

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

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

于 2014-06-11T14:51:02.867 回答