我正在遵循 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 使用起来有点混乱,而且文档很少。
巧合的是,我现在正在学习同样的事情,并且有完全相同的问题(所以这里需要注意的是,我绝不是专家,但希望这能有所帮助)。
看起来该表单实际上是由您的 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 (如果我想在验证后将其附加到那里)