我不明白如何使用express session
进行序列化和反序列化。
当我安装Express-session时,它说我需要序列化和反序列化功能:
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
Server.js从登录表单发布路径:
router.post('/login', passport.authenticate('login', {
successRedirect: '/home',
failureRedirect: '/',
failureFlash : true
}));
我的问题是,当用户尝试从我的HTML上的form
登录并按照上面指定'/login'
点击端点时,这是快递会话发挥作用的地方吗?因此,快速会话将创建一个cookie,其会话ID为我user._id
函数中指定的serializeUser
,它会将此cookie提供给客户端吗?那么现在当客户端在端点'/login'
向该同一服务器发出任何后续请求时,它会自动调用反序列化用户而不通过passport
中提供的router.post('/login', ...)
中间件?
我不确定调用这两个序列化函数的时间和地点以及express会话实际上如何使用它们?任何澄清将不胜感激。
答案 0 :(得分:0)
要理解这一点,我们必须仔细了解什么是cookie以及它如何工作?
它是数据的集合,存储在计算机浏览器中,并随请求一起在请求标头中发送给服务器,并由浏览器在响应标头中从服务器接收。
现在我们知道http请求是无状态的(意味着每个请求都是服务器的新请求,例如,如果您登录到某个网站,这是您首先提出的请求,然后又发出了第二次请求以显示您的个人资料那么此时服务器不知道您是谁,因此为了获得授权,服务器需要知道您是谁,并且此信息存储在cookie中。 当您登录时,您的凭据将发送到服务器,服务器会在cookie中设置这些凭据,然后将其发送到浏览器,然后在您发出每个请求后,该cookie会被发送回服务器,然后由服务器进行验证,因此允许u访问相关信息。
答案是很大的否,因为用户可以在闲暇时对其进行操作。是的,cookie数据可以随时操作,因此将用户凭据存储在cookie中并不安全,那么解决方案是什么? 这里我们来谈谈会议的想法。
会话是存储在服务器端而不是浏览器中的对象,因此保持安全。现在,它如何帮助授权,请参阅: 当用户登录时,请求将发送到服务器,并创建一个对象会话,该对象会话存储用户的凭证,并且为该会话对象提供一个唯一的ID,该ID使用该 serializerUser()函数和该ID进行加密存储在Cookie中,然后发送到浏览器。现在,用户如果还尝试对其进行操作,则他/她将无法执行,因为cookie仅包含已加密且无法以任何方式解码的会话ID。 然后,此Cookie随另一个请求一起发送到浏览器,然后通过 deserializeUser()函数进行解码,并与存储的会话ID匹配,从而验证用户。