提问者:小点点

Passport Session(expressjs)-为什么我们需要序列化和反序列化?


passport-authentication中serialize和deserialize方法的用途。


共1个答案

匿名用户

我费了好大劲才把头绕起来。但这就是我得到的,希望它能节省你的时间。

您可以通过两种方式与服务器进行交互,以提供对需要身份验证的受限信息的访问。1.cookie和2.sessions

长话短说-Cookie是不安全的,因为它仍然存在于客户端,并且可以被访问和操作。

但是当涉及到会话时,会话id(将被解释)被保存在服务器中,因此它是一个安全的赌注。

passport中间件的流程如下:

    执行

4.SERIALIZE当身份验证有效时,执行SERIALIZE方法(以开始会话)(它使用方法定义中传递的任何参数)通常保存user.id,并在每次发送请求时对其进行验证。

Passport.SerializeUser(function(user,done){done(null,user._ID);)

在上述方法中,传递user对象,并将user._id作为键保存在服务器中。这意味着这个键(user.id)将用于维护会话。

这是通过将user._id保存在req.passport.session.user=_id:.(descerialize后解释)来实现的

5.DESERIALIZE Serialize方法只在身份验证后执行一次,稍后,对于后续请求执行DESERIALIZE方法,该方法维护会话,在会话中传递user.id以维护会话,如下所示。(直到浏览器打开*)。

Passport.DeserializeUser(function(id,done)})

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

身份验证/无身份验证:

还记得app.js中的passport.initialize中间件和passport.session中间件吗

passport.initialize中间件在每个请求上执行。然后passport.session中间件将在服务器上查找序列化用户。

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

req.session.passport.user=}。

但是当身份验证已经完成并且passport.authenticate在完成的回调中返回了一个有效用户(用户名和密码匹配情况)时,则

req.session.passport.user=user._id

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

在后续请求下一次执行Passport.Initialize时,此Id将附加到会话(req.session.Passport.User)。

initialize方法在会话中找到id后,它执行反序列化方法&;用户信息通过req.User加载到请求中。

请务必建议对这个答案进行编辑或添加。-PVThomas