PRA*_*ESE 10

我很难缠绕它.但这就是我得到的,希望它能节省你的时间.

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

冗长的短cookie是不安全的,因为它仍然在客户端,可以访问和操作.

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

这是护照中间件的过程:

  1. 登录信息通过(用户名和密码)
  2. 执行Passport Authenticate(本地策略)以检查用户名和密码是否有效.
  3. 如果用户名和密码为VALID,则返回带有Null(无错误)和USER(来自数据库)的DONE回调.

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. DESERIALIZE 序列化方法仅在认证之后执行一次,之后,对于后续请求,执行DESERIALIZE METHOD,其保持传递User.id的会话以维持会话,如下所示.(直到浏览器打开*).

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

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

认证/无认证:

你还记得在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).

在initialize方法找到会话中的id后,它执行deserialize方法,并通过req.user将用户信息加载到请求中.

请建议对此答案进行编辑或添加.-PVTHOMAS