快速会话和 Cookie
Posted
技术标签:
【中文标题】快速会话和 Cookie【英文标题】:Express Session and Cookie 【发布时间】:2016-08-08 21:21:57 【问题描述】:我不明白序列化和反序列化如何使用 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'
时,这就是快速会话发挥作用的地方吗?所以 express session 将创建一个会话 id 为 user._id
的 cookie,正如我的 serializeUser
函数中指定的那样,它会将这个 cookie 提供给客户端?因此,现在当客户端在端点'/login'
向同一台服务器发出任何后续请求时,它将自动调用反序列化用户,而无需通过passport
中提供的passport
中间件@?
我不确定这两个序列化函数何时何地被调用,以及 express session 如何实际使用它们?任何澄清将不胜感激。
【问题讨论】:
这有帮助吗?:***.com/questions/22052258/… .. 我看到投票最多的答案解释了很多关于会话和护照的工作原理。 是的,这很有帮助!只是一些澄清:所以基本上在用户第一次使用login
策略登录之后,cookie被保存在该用户的内存中,并且每次用户登录时,它都会将cookie传递给服务器并调用passport.authenticate('session')
策略而不是 login
策略正确吗?
【参考方案1】:
要理解这一点,我们必须了解什么是 cookie 以及它是如何工作的基本概念?
Cookie:
它是存储在计算机浏览器中的数据集合,并在每个请求的请求标头中发送到服务器,并由浏览器在响应标头中从服务器接收。
cookie 需要什么?
现在我们知道 http 请求是无状态的(意味着每个请求都是对服务器的新请求,例如,如果您登录某个网站,这是您发出的第一个请求,然后您发出第二个请求以显示您的个人资料那么此时服务器不知道你是谁),因此为了授权,服务器需要知道你是谁,并且此信息存储在 cookie 中。 当您登录时,您的凭据被发送到服务器,服务器将这些凭据设置在 cookie 中,然后发送到浏览器,之后您发出的每个请求,该 cookie 都会被发送回服务器,然后经过验证并因此允许u 访问相关信息。
现在您应该想到 cookie 可以安全地存储用户凭据吗?
答案是一个很大的否,因为用户可以在他/她的闲暇时间操纵它。是的,cookie 数据可以随时被操纵,因此将用户凭据存储在 cookie 中是不安全的,那么解决方案是什么? 在这里,我们想到了会话。
会话:
Session 是存储在服务器端而不是浏览器中的对象,因此保持安全。现在它如何帮助授权,请参阅: 当用户登录时,请求被发送到服务器并创建一个对象会话,该会话存储用户的凭据,并且此会话对象被赋予一个唯一的 ID,该 ID 使用该 serializerUser() 函数和此 ID 进行加密存储在 cookie 中,然后发送到浏览器。现在用户如果也尝试操作它,他/她不能,因为 cookie 只包含加密的会话 ID,无法以任何方式解码。 然后这个 cookie 通过另一个请求发送到浏览器,然后通过 deserializeUser() 函数并被解码,与存储的会话 id 匹配,从而验证用户。
【讨论】:
以上是关于快速会话和 Cookie的主要内容,如果未能解决你的问题,请参考以下文章