javascript - 关于 passport.js 工作原理的问题。具体关于 user.id

标签 javascript node.js mongodb express passport.js

我的 modeldocrecord 或任何您想调用的内容中没有 id 字段它。那么 done(null, user.id) 是如何工作的呢?我有一个 _id 但没有 id。看起来 Passport 对象正在使用数据库中用户的 _id 添加到我的 session 中,但它是如何获得 _id 的?它是自动完成的吗?在它说的文档中

In this example, only the user ID is serialized to the session

它是怎么得到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 方法。

编辑假设我想通过名称字段上的 Passport 传输文档(用户),我应该使用 user.name 吗?

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

最佳答案

So how come done(null, user.id) works. I have an _id but no id.

您正在使用 Mongoose,它添加了一个所谓的 virtual getter called id到文档,返回 _id 属性。因此,在您的情况下,user.iduser._id 都将起作用(并将返回相同的值)。

Does the fact that I use passport.use() somehow connect the user in the DB to the passport methods.

是也不是。您传递给 passport.use() 的策略实现了身份验证过程。 必须实现如何根据您的数据库验证输入的用户信息。在示例代码中,调用了 User.findOne(),并根据提供的信息检查该调用的结果(用户名 是一个有效的用户名?如果是,password 是属于该用户的密码吗?”)。

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

Also I'm not really sure about how serializing works.

序列化用于将有关用户的信息存储在“ session 对象”中。该对象应该能够唯一标识用户。由于 user.id(或 user._id)对用户而言是唯一的,因此它是一个很好用的属性。

这就是 passport.serializeUser() 的用武之地:它传递用户文档,并且它应该为 Passport(通过调用回调函数)提供有关该用户的唯一标识信息。因此 done(null, user.id)

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

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

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

关于javascript - 关于 passport.js 工作原理的问题。具体关于 user.id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37559391/

相关文章:

ruby - 生成源映射时出错 - grunt 和 sass 配置

Java,java.util.HashMap 无法转换为 org.bson.BSONObject

javascript - jquery ajax 响应中缺少 responseJSON

mongodb - findAndModify 是否有效锁定文档以防止读取冲突?

javascript - 将数据作为对象传递给 mongoDb,将其用作查询和比较

javascript - 使用正则表达式出现无效量词错误(英国电话号码)

javascript - 如何在qq ajax文件 uploader 中检查条件?

javascript - 从 WebStorm 运行 Protractor 测试时,在导入语句中获取意外的标记 {

javascript - Firefox 中的多选错误

python - 获取错误/usr/bin/env : node : Permission Denied