困惑:帮助理解 Passport.js 验证用户

问题描述 投票:0回答:1

我正在遵循 Geeks for Geeks 使用护照 Js Passport-local-mongoose 的教程。

有几件事我很困惑。我不明白。为了注册用户,您可以使用如下的发布请求:

router.post("/register", function (req, res) {
    User.register(new User({ email: req.body.email, username: req.body.username }), req.body.password, function (err, user) {
        if (err) {
            res.json({ success: false, message: "Your account could not be saved. Error: " + err });
        }
        else {
            req.login(user, (er) => {
                if (er) {
                    res.json({ success: false, message: er });
                }
                else {
                    res.json({ success: true, message: "Your account has been saved" });
                }
            });
        }
    });
});

在这里我了解到您从表单中获取电子邮件、用户名和密码。获得后,将其输入到数据库中。

我很难理解的部分是登录。根据我的理解,登录时需要检查用户是否存在或者表单是否有错误。例如电子邮件或密码。教程有以下代码:

router.post("/login", function (req, res) {
    if (!req.body.username) {
        res.json({ success: false, message: "Username was not given" })
    }
    else if (!req.body.password) {
        res.json({ success: false, message: "Password was not given" })
    }
    else {
        passport.authenticate("local", function (err, user, info) {
            if (err) {
                res.json({ success: false, message: err });
            }
            else {
                if (!user) {
                    res.json({ success: false, message: "username or password incorrect" });
                }
                else {
                    const token = jwt.sign({ userId: user._id, username: user.username }, secretkey, { expiresIn: "24h" });
                    res.json({ success: true, message: "Authentication successful", token: token });
                }
            }
        })(req, res);
    }
});

这就是我真正困惑的地方。在寄存器中,我们需要从表单中获取用户输入。例如用户名、电子邮件和密码。但在登录中似乎并非如此。您使用:

passport.authenticate("local", function (err, user, info)

看起来这个

user
有我表单中的所有信息。例如用户名,电子邮件和密码。但是这些信息是什么时候放入
user
的。护照怎么知道
user
是什么。我从来没有像注册时那样从表单中传递请求信息。我期待做类似的事情:

   passport.authenticate("local", function (err, req.body.email, req.body.password, info)

这个

user
对象是在哪里创建的?我注册用户后是否被存储?根据我的理解,我认为我们需要将表单数据
req.body.username, req.body.email, req.body.password
传递到
passport.authenticate()
中。我检查了护照文件,没有发现任何有关
user
的信息。有没有任何文档可以解释这一点? Passport 使用起来有点混乱,而且文档很少。

node.js express passport.js
1个回答
0
投票

巧合的是,我现在正在学习同样的事情,并且有完全相同的问题(所以这里需要注意的是,我绝不是专家,但希望这能有所帮助)。

看起来该表单实际上是由您的 LocalStrategy 处理的,而该 LocalStrategy 不在您的帖子中,但希望您也已设置。

LocalStrategy 处理您的表单数据,并期望有一个默认访问的 req.body.username 和 req.body.password。

类似这样的事情

passport.use(new LocalStrategy(
  function (username, password, done) {

    db.users.findByUsername(username, (err, user) => {

      if(err) return done(err);
 

      if(!user) return done(null, false);
 

      if(user.password != password) return done(null, false);
 
      return done(null, user)
    });
  })
);

在这种情况下,匿名函数实际上是通过 (req.body, username, req.body.password, done) 来调用的

如果您的主体具有不同的属性,您也可以通过在匿名函数之前传递一个对象来覆盖这些值。

类似这样的事情

{
    usernameField: 'email',
    passwordField: 'oneTimePassword'
}

我感兴趣的,也许有人可以评论的是,我们可以告诉 LocalStrategy 在其他地方查找用户名和密码参数吗?例如 req.email 而不是 req.body.email (如果我想在验证后将其附加到那里)

© www.soinside.com 2019 - 2024. All rights reserved.