gpt4 book ai didi

node.js - 如何更改 Passport 以使用电子邮件而不是用户名进行身份验证?

转载 作者:太空宇宙 更新时间:2023-11-04 03:26:49 24 4
gpt4 key购买 nike

我想使用用户的电子邮件和密码登录。但在 Passport 中您应该使用用户名。

我已经尝试了很多关于如何做到这一点的例子。但没有奏效。真正的问题是当应用程序想要将记录保存到数据库中时。尽管我已更改代码以查找电子邮件而不是用户名字段,但这是保存到数据库的最终记录:

'name': 'joseph',
'username' : 'example@gmail.com',
.
.

但我不希望将电子邮件保存为用户名。当我在用户注册后用 mongoose 更改它时,它是正确的,但当应用程序想要验证用户身份时,问题又会出现。

它将在数据库中查找用户名字段而不是电子邮件。由于用户将提供电子邮件作为用户名,因此登录将失败。

代码:

app.get("/register", function(req, res) {
var newUser = new User({
username : req.body.username,
email : req.body.email,
name: req.body.name
});

User.register(newUser, req.body.password, function(err, user) {
if (err) {
req.flash('error', "An error ocurred, please try again.");
return res.redirect('back');
} else {
passport.authenticate("local")(req, res, function() {
req.flash("success", "Welcome");
res.redirect("/admin");
});
}
});

});

此代码按照我想要的方式注册用户,但问题在于登录:

router.post('/login', middleware.outLoggedIn, passport.authenticate("local", {
successRedirect: "/admin",
failureRedirect: "/login",
failureFlash: "Invalid username or password",
successFlash: "Welcome!"
}));

它总是失败,因为它会获取登录表单中提供的用户电子邮件,然后将其与数据库中的电子邮件进行比较。由于我已经保存了用户的电子邮件和用户名,它会将登录表单中提供的电子邮件与数据库中的用户名字段进行比较。然后失败了。

这是数据库中的用户:

{
"_id" : ObjectId("5901cc5c0256ed17b4d61960"),
"salt" : "---",
"hash" : "---",
"username" : "joseph320",
"email" : "example@gmail.com",
"name" : "joseph",
"__v" : 0
}

(登录表单需要电子邮件和密码)

我也这样做过:

passport.use(new localStrategy({
usernameField: 'email'
}, User.authenticate()));

如果您能告诉我如何解决这个问题,我真的很感激。

最佳答案

您能提供更多代码吗?一些上下文在这里很重要,例如您使用哪些 npm 模块来读取和写入数据库。

** 如果您使用passport-local-mongoose

您说您正在使用 mongoose,看起来您可能会在此基础上使用 passport-local-mongoose 。如果是这种情况,您可以查看 passport-local-mongoose 的选项。这还包括一个 usernameField 选项,它指示您希望存储“用户名”的位置。其用法如下所示:

User.plugin(passportLocalMongoose, {usernameField: 'email'})

关于node.js - 如何更改 Passport 以使用电子邮件而不是用户名进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43656039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com