Node.js 如何正确地使用passport.js实现用户序列化?
好的,我只是进入平均堆栈,我正在尝试用Passport.js构建一个应用程序 我刚刚开始用户序列化以维护会话。在他们的示例中,Passport将其用于序列化和反序列化: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.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可以是我想要的任何内容,因为它不会被发送到客户端,对吗?理论上是的,但从未尝试过返回对象或数组是否有效。