【发布时间】:2018-01-05 00:30:56
【问题描述】:
序列化和反序列化方法在passport-authentication中有什么用。
【问题讨论】:
标签: express passport.js
序列化和反序列化方法在passport-authentication中有什么用。
【问题讨论】:
标签: express passport.js
我很难理解它。但这就是我得到的,希望它可以节省您的时间。
您可以通过两种方式与服务器交互以提供对需要身份验证的受限信息的访问。 1.cookies和2.sessions
长话短说 - cookie 不安全,因为它保留在客户端并且可以访问和操作。
但是当涉及到会话时,会话 ID(待解释)会保存在服务器中,因此是一个安全的选择。
护照中间件的流程如下:
4.序列化 当身份验证有效时,执行序列化方法(开始会话)(使用方法定义中传递的任何参数)通常会保存 User.id 并在每次发送请求时进行验证。
passport.serializeUser(function(user, done) { 完成(空,用户。_id); })
在上述方法中,传递了user对象,并将user._id作为key保存在服务器中。 这意味着此密钥(user.id)将用于维护会话。
这是通过将 user._id 保存在 req.passport.session.user ={_id : …}….(在反序列化后解释)来完成的
5.反序列化 Serialize 方法仅在身份验证后执行一次,稍后,对于后续请求,将执行 DESERIALIZE METHOD 来维护传递 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 在 done 回调中返回了一个 VALID USER(用户名和密码匹配的情况),那么
req.session.passport.user = user._id
User._id 被传递给 req.session.passport.user
当在后续请求中下一次执行 passport.initialize 时,此 ID 将附加到会话 (req.sesssion.passport.user)。
initialize 方法在会话中找到 id 后,它执行反序列化方法并将用户信息通过 req.user 加载到请求中。
请对此答案提出修改或补充建议。-PVTHOMAS
【讨论】:
user.id 的含义吗?我们是否需要在mongo db 模型中实际拥有它,或者它是 mongos 自动生成的_id?如果我们需要 id 属性,如果它是强制性的,最好添加它以进行澄清。为什么不使用_id?