在护照验证中使用序列化和反序列化方法有什么用。
答案 0 :(得分:8)
我很难缠绕它。但这就是我所得到的,希望它可以节省你的时间。
有两种方法可以与服务器交互,以提供对需要身份验证的受限信息的访问。 1.cookies和2.sessions
长篇短篇小说是不安全的,因为它仍然在客户端,可以访问和操作。
但是当谈到会话时,会话ID(将被解释)被保存在服务器中,从而使其成为一个安全的赌注。
这是护照中间件的流程:
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