有关passport.js如何运作的问题。特别是关于user.id

时间:2016-06-01 04:22:52

标签: javascript node.js mongodb express passport.js

我的idmodeldoc或您想要的任何字段都没有record字段。那么done(null, user.id)如何运作呢?我有_id但没有id。看起来护照对象正在添加到我与DB中用户的_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,编辑可以说我想通过名称字段上的护照转移doc(用户)吗?

另外,我不确定序列化是如何工作的

1 个答案:

答案 0 :(得分:3)

  

那么done(null, user.id)如何运作呢?我有_id但没有id

您正在使用Mongoose,它向文档添加了一个所谓的virtual getter called id,它返回_id属性。因此,在您的情况下,user.iduser._id都可以使用(并且会返回相同的内容)。

  

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

是和否。传递给passport.use()的策略实现了身份验证过程。 必须实现如何根据您的数据库验证输入的用户信息。在示例代码中,调用User.findOne(),并根据提供的信息检查该调用的结果(username是否为有效用户名?如果是,则为{{1这个用户的密码是什么?“)。

如果用户名和密码匹配,则以用户文档作为参数调用password回调。本文档是Passport传递给其他各个部分的文档,例如done(见下文)。

  

此外,我不确定序列化是如何工作的。

序列化用于在“会话对象”中存储有关用户的信息。该对象应该能够唯一地标识用户。由于passport.serializeUser()(或user.id)对用户来说是唯一的,因此它是一个很好用的属性。

这就是user._id的来源:它传递给用户文档,它应该为Passport(通过调用回调函数)提供有关该用户的唯一标识信息。因此passport.serializeUser()

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

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

如果所有这些步骤都成功执行(情况并非总是如此,因为Cookie可能会过期,用户可能会被删除等),这意味着Passport能够肯定地识别用户,和他们不必再次登录。至少在会议到期之前。