因此,根据我的理解,Passport将为任何用户生成唯一的会话ID,即使他们未经身份验证。一旦他们进行身份验证,服务器就可以将userId(通常来自数据库)与此会话ID相关联。
我正在查看代码,看起来像passport.serialize将userId存储在会话中,然后passport.deserialize获取存储在会话中的用户ID并查询数据库以获取更多用户信息< / p>
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id)
.then(user => done(null, user))
.catch(err => done(err));
});
我真正看到的是独特的sessionId。如果userId存储在会话中,那么任何人都不能欺骗userId并获取用户信息吗?或者是sessionId和userId之间的映射是否由Passport执行?
答案 0 :(得分:1)
是的,在正常情况下,Passport会创建唯一的会话密钥,然后使用您在应用启动时配置它时提供的密码对其进行加密。该密钥的加密形式作为cookie头发送到客户端,这对于客户端破解来说计算成本很高。
当客户端在下一个请求中发回该cookie时,Passport使用相同的秘密从cookie中提取存储的会话密钥以解密它,然后将该值传递给deserializeUser回调以获取您拥有的任何相关信息。
其中的一些细节因某些策略而异(例如JWT策略不使用cookie,它使用作为标题发送的JWT令牌本身),但一般模式是相同的。