【问题标题】:Questions about how passport.js works. Specifically about user.id关于 passport.js 如何工作的问题。特别是关于 user.id
【发布时间】:2016-09-30 06:35:02
【问题描述】:

我的 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 吗?

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

【问题讨论】:

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


    【解决方案1】:

    那么done(null, user.id) 是如何工作的。我有一个_id,但没有id

    您正在使用 Mongoose,它将所谓的 virtual getter called id 添加到文档中,返回 _id 属性。所以在你的情况下,user.iduser._id 都可以工作(并且会返回相同的结果)。

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

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

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

    我也不太确定序列化是如何工作的。

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

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

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

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

    如果所有这些步骤都成功执行(并非总是如此,因为 cookie 可能会过期,用户可能会被删除等),这意味着 Passport 能够正确识别用户,并且他们不必再次登录。至少要等到会话过期。

    【讨论】:

    • 好的,所以done(null, user.id)passport.serializeUser() 的回调中。我想知道user.id 在什么时候或如何获得我们正在验证的用户的 ID。
    • 哦,我认为这就是passport.use 方法和策略发挥作用的地方。 passport.use 中的 done 方法与用户文档一起返回。这就是我们如何在serializeUser() 中获得适当的user.id。我很困惑,我想看看用户文档是如何从源代码中的 passport.use() 转移到 passpor.serializeUser 的。当你有机会时,也许可以给我看一下。
    • 我想看看passport.use()和序列化方法在源代码中是如何联系起来的。谢谢
    • 代码starts here。指出代码中文档在策略和serializeUser 之间传输的特定位置并不容易,因为有很多移动部件。
    猜你喜欢
    • 2020-10-31
    • 2020-11-29
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多