有关如何passport.js工作的问题。 具体关于user.id

我的modeldocrecord没有id字段,或者您想要调用它的任何内容。 那么怎么done(null, user.id)作品。 我有一个_id但没有id 。 它看起来像一个护照对象被添加到我的会话与用户在数据库中的_id ,但它是如何得到_id是自动完成的? 在文档中说

在这个例子中,只有用户ID被序列化到会话中

它是如何得到的ID和它是如何得到用户?

我的代码中有类似的例子:

 passport.serializeUser(function(user, done){ done(null, user.id) }); passport.deserializeUser(function(id, done){ User.findById(id, function(err, user){ done(err, user); }) }); 

获取用户ID需要哪些步骤?

我也有

 passport.use("login", new LocalStrategy(function(username, password, done){ User.findOne({username : username}, function(err, user){ if(err){return done(err)} if(!user){ return done(null, false, {message : "no User has that name"}) } ....... 

我使用passport.use()以某种方式将DB的用户连接到护照方法。

编辑可以说我想通过名称字段上的护照传输文档(用户)我应该使用user.name?

另外,我不太确定如何序列化的作品

那么怎么done(null, user.id)作品。 我有一个_id但没有id

您正在使用Mongoose,它将一个名为id 虚拟getter添加到文档,返回_id属性。 所以在你的情况下, user.iduser._id都将工作(并将返回相同的)。

我使用passport.use()以某种方式将DB中的用户连接到护照方法。

是和不是。 您传递给passport.use()的策略实现身份validation过程。 必须实施input的用户信息如何针对您的数据库进行validation。 在示例代码中,对User.findOne()进行调用,并根据提供的信息( username是否为有效用户名?”,如果是,则是password属于此用户的密码? )检查该调用的结果。 )。

如果用户名和密码匹配,则用户文档作为参数调用donecallback。 这个文件是Passport传递给其他各个部分的,例如passport.serializeUser() (见下文)。

另外,我不太确定如何序列化的作品。

序列化用于在“会话对象”中存储关于用户的信息。 这个对象应该能够唯一标识用户。 而且由于user.id (或user._id )对用户来说是唯一的,所以它是一个很好的属性。

这就是passport.serializeUser()来的地方:它传递给用户文档,它应该提供Passport(通过调用callback函数)一个关于该用户的唯一标识信息。 因此done(null, user.id)

会话对象本身也由“会话密钥”唯一标识。 该密钥存储在HTTP cookie中,并在用户成功login时发送到浏览器。 当浏览器在您的网站上打开另一个页面时,它会发送该cookie,并使用cookie中的会话密钥从“会话存储”中检索会话对象。

会话对象包含唯一的用户标识,但不包含用户信息的其余部分。 这就是passport.deserializeUser()进来的地方:它传递了id,并执行数据库查找来检索属于该id的完整用户文档。 这是Passport将在您的路由处理程序中作为req.user提供的内容。

如果所有这些步骤都成功执行(事实并非总是如此,因为cookies可能会过期,用户可能会被删除等),这将意味着Passport能够肯定地识别用户, 而且他们不必logging再次 。 至less在会议过期之前。