Node.js 如何正确地使用passport.js实现用户序列化?

Node.js 如何正确地使用passport.js实现用户序列化?,node.js,serialization,express,hash,passport.js,Node.js,Serialization,Express,Hash,Passport.js,好的,我只是进入平均堆栈,我正在尝试用Passport.js构建一个应用程序 我刚刚开始用户序列化以维护会话。在他们的示例中,Passport将其用于序列化和反序列化: passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) {

好的,我只是进入平均堆栈,我正在尝试用Passport.js构建一个应用程序

我刚刚开始用户序列化以维护会话。在他们的示例中,Passport将其用于序列化和反序列化:

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});
所以,我的问题是:这个例子被认为是安全的吗?如果我理解正确的话,难道这不意味着客户机可以伪造用户ID以作为任何具有该ID的用户登录吗

我想我要问的是,他们的示例是否被认为是“安全的”并且是一种正确的操作方式,或者您是否希望更改这些函数以生成唯一的序列化。如果这被认为是安全的,那么我想我错过了一些关于这是如何工作的,我很想被填补

另一方面,如果这是不安全的,并且我需要编写自己的函数来代替这些函数,那么以下方法是否是一种有效且安全的方法:

  • 对用户进行序列化后,生成一个随机散列并将其放入用户的数据库条目中。随机散列是表示该用户的序列
  • 反序列化后,在数据库中查找随机哈希并返回相应的用户。如果没有找到散列,抛出某种错误
  • 当用户注销时,从数据库中的条目中删除其串行哈希

如果在此之前我的逻辑是有效的,那么生成此随机哈希的正确方法是什么?

是的,这就是序列化/反序列化的方法。未从客户端接收到
id

会话信息以随机ID存储到本地会话存储(如数据库)。例如,
express Session
用于生成会话ID。该ID设置为cookie,然后发送到客户端

当客户端发出请求时,如果cookie未被篡改,则会从cookie中读取会话ID(通常使用初始化会话时定义的
密码
对ID进行签名)。使用此ID,将从本地会话存储中读取实际会话数据。这就是反序列化中使用的
id
的来源

以下是存储到MongoDB的会话对象的示例:

{
  "_id" : "_RXnIfFeb_qH6AXMO2ounrxlJZPHkwda",
  "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{\"user\":\"5614c62e4372842244660dcf\"}}"
}
\u id
这里是在cookie中签名和发送的内容。解码为JSON对象的
会话
字符串是:

{
  "cookie": {
    "originalMaxAge": null,
    "expires": null,
    "secure": false,
    "httpOnly": true,
    "path": "/"
  },
  "passport": {
    "user": "5614c62e4372842244660dcf"
  }
}
这里,
passport.user
是我的应用程序
seralizeUser
返回的实际用户ID,在加载会话时,该ID被提供给
反序列化用户


那么,如果更改cookie内容会发生什么情况?如果cookie已签名,它将无效,因为更改的值与签名不匹配。如果未签名,则在查询会话存储时使用该值。查询将不会返回任何内容,因为您更改了ID,并且数据库中没有匹配的会话(除非您发现/猜测了另一个活动会话的会话ID-即正在执行)。

好的,最终passport.user可以是我想要的任何内容,因为它不会被发送到客户端,对吗?理论上是的,但从未尝试过返回对象或数组是否有效。