Passport Session(expressjs)的基础知识 - 为什么我们需要序列化和反序列化?

时间:2017-07-28 20:30:04

标签: express passport.js

在护照验证中使用序列化和反序列化方法有什么用。

1 个答案:

答案 0 :(得分:8)

我很难缠绕它。但这就是我所得到的,希望它可以节省你的时间。

有两种方法可以与服务器交互,以提供对需要身份验证的受限信息的访问。 1.cookies和2.sessions

长篇短篇小说是不安全的,因为它仍然在客户端,可以访问和操作。

但是当谈到会话时,会话ID(将被解释)被保存在服务器中,从而使其成为一个安全的赌注。

这是护照中间件的流程:

  1. 已通过登录信息(用户名和密码)
  2. 执行Passport Authenticate(本地策略)以检查用户名和密码是否有效。
  3. 如果用户名和密码为VALID,则返回Null(无错误)和USER(来自数据库)的DONE回调如果用户名和密码为VALID。
  4. 4.的 SERIALIZE 当身份验证有效时,SERIALIZE方法已执行(开始会话)(使用方法定义中传递的任何参数),通常会保存User.id并在每次发送请求时进行验证。

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

    在上面的方法中,传递用户对象并将user._id保存为服务器中的密钥。  这意味着此密钥(user.id)将用于维护会话。

    这是通过在req.passport.session.user = {_ id:...}中保存user._id来完成的。(反序列化后解释)

    5的反序列化 Serialize方法仅在身份验证之后执行一次,之后,对于后续请求执行DESERIALIZE METHOD,这将维护传递User.id的会话以维护会话,如下所示。 (直到浏览器打开*)。

    passport.deserializeUser(function(id,done){... .. }

    用户对象在回调中返回,并作为req.user附加到请求。

    AUTHENTICATION / NO AUTHENTICATION:

    你还记得App.js中的 passport.initialize中间件 passport.session中间件

    每次请求都会执行passport.initialize中间件。 之后,passport.session中间件将在服务器上查找序列化用户。

    如果没有进行用户身份验证,则会创建一个空对象(req.session.passport.user),其中将加载序列化用户。

    req.session.passport.user = {}。

    但是当验证完成并且Passport.Authenticate在完成回调中返回了一个VALID USER(用户名和密码匹配的情况),那么

    req.session.passport.user = user._id

    User._id传递给req.session.passport.user

    当下次在后续请求中执行passport.initialize时,此ID将附加到会话(req.sesssion.passport.user)。

    在初始化方法找到会话中的id后,它执行deserialize方法&用户信息通过req.user加载到请求中。

    请建议对此答案进行修改或补充。 -PVTHOMAS