有关如何passport.js工作的问题。 具体关于user.id
我的model
, doc
或record
没有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.id
和user._id
都将工作(并将返回相同的)。
我使用
passport.use()
以某种方式将DB中的用户连接到护照方法。
是和不是。 您传递给passport.use()
的策略实现身份validation过程。 您必须实施input的用户信息如何针对您的数据库进行validation。 在示例代码中,对User.findOne()
进行调用,并根据提供的信息( “ username
是否为有效用户名?”,如果是,则是password
属于此用户的密码? )检查该调用的结果。 )。
如果用户名和密码匹配,则用户文档作为参数调用done
callback。 这个文件是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在会议过期之前。