我的model
、doc
或record
中没有id
字段,或者你想怎么称呼它。那么done(null, user.id)
是怎么工作的呢。我有_id
,但没有id
。看起来有一个passport对象被添加到我与数据库中用户的_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
中的用户连接到passport方法。
编辑假设我想通过姓名字段上的护照转移文档(用户),我应该使用user.name吗?
此外,我真的不确定串行化是如何工作的
那么
done(null, user.id)
是如何工作的呢。我有_id
,但没有id
。
您使用的是Mongoose,它将一个名为id
的所谓虚拟getter添加到文档中,返回_id
属性。因此,在您的情况下,user.id
和user._id
都将工作(并且将返回相同的结果)。
我使用
passport.use()
的事实是否以某种方式将DB中的用户连接到passport方法。
是和否。传递给passport.use()
的策略实现身份验证过程您必须实现如何根据数据库验证输入的用户信息。在示例代码中,调用User.findOne()
,并根据提供的信息检查该调用的结果("username
是有效的用户名吗?如果是,password
是属于该用户的密码吗?">)。
如果用户名和密码匹配,则调用done
回调,并将用户文档作为参数。这份文件是Passport将传递给其他各个部分的文件,例如传递给passport.serializeUser()
(见下文)。
此外,我真的不确定序列化是如何工作的。
序列化用于将有关用户的信息存储在"会话对象"中。这个对象应该能够唯一地识别用户。由于user.id
(或user._id
)对用户来说是唯一的,因此使用它是一个很好的属性。
这就是passport.serializeUser()
的作用:它传递给用户文档,它应该(通过调用回调函数)为Passport提供一条唯一标识该用户的信息。因此CCD_ 29。
会话对象本身也由"会话密钥"唯一标识。此密钥存储在HTTP cookie中,并在用户成功登录时发送到浏览器。当浏览器在你的网站上打开另一个页面时,它会发送cookie,并使用cookie中的会话密钥,从"会话存储"中检索会话对象。
会话对象包含唯一的用户id,但不包含其余的用户信息。这就是passport.deserializeUser()
的作用:它传递id,并执行数据库查找以检索属于该id的完整用户文档。这就是Passport将在路由处理程序中作为req.user
提供的内容。
如果所有这些步骤都成功执行(情况并非总是如此,因为cookie可能会过期,用户可能会被删除,等等),这将意味着Passport能够肯定地识别用户,他们不必再次登录。至少在会话到期之前不会。