我想使用用户的电子邮件和密码登录。 但是在护照上你应该使用用户名。
我尝试过很多关于如何做到这一点的例子。但没有工作。 真正的问题是应用程序想要将记录保存到数据库中。 虽然我已经更改了代码以查找电子邮件而不是用户名字段,但这是保存到数据库的最终记录:
'name': 'joseph',
'username' : 'example@gmail.com',
.
.
但我不希望将电子邮件另存为用户名。 当我在用户注册后使用mongoose进行更改时,这将是正确的,但当app想要对用户进行身份验证时,问题就会出现。
它会查找数据库中的用户名字段而不是电子邮件。因为用户将提供电子邮件作为用户名,登录将失败。
代码:
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()));
如果你能告诉我如何解决这个问题,我真的很感激。
答案 0 :(得分:3)
您能提供更多代码吗?一些上下文在这里很重要,例如你用来读写数据库的npm模块。
** 如果您使用的是passport-local-mongoose
你说你使用的是猫鼬,看起来你可能正在使用passport-local-mongoose
。如果是这种情况,您可以查看usernameField
的选项。这还包括User.plugin(passportLocalMongoose, {usernameField: 'email'})
选项,用于指示您希望"用户名"要存储。用法如下:
ngOnInit() {
this.getContacts().subscribe(
data => {
this.contacts = data;
console.log('NewInvoice.contacts:', data);
this.selectedContactId = this.contacts[0].id;
console.log('selectedContactId: ' + this.selectedContactId);
},
error => {
console.error('Error getting contacts via subscribe() method:', error);
},
() => {
this.getSelectedContact();
}
)
}