所以我使用passport-local和express来处理用户登录。到目前为止,我已经能够在使用用户名时成功登录,但是用户名很难记住,我个人认为它们不应该用于处理用户,因此我尝试修改护照上提供的示例策略 - 通过电子邮件确认用户的本地页面,但代码不起作用。
我对电子邮件的策略是:
passport.use(new LocalStrategy(function(email, password, done) {
User.findOne({ email: email }, {}, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false, { message: 'Unknown user ' + e }); }
user.comparePassword(password, function(err, isMatch) {
if (err) return done(err);
if(isMatch) {
return done(null, user);
} else {
return done(null, false, { message: 'Invalid password' });
}
});
});
}));
它来自这个策略:
//The login strategy
passport.use(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: 'Unknown user ' + username }); }
user.comparePassword(password, function(err, isMatch) {
if (err) return done(err);
if(isMatch) {
return done(null, user);
} else {
return done(null, false, { message: 'Invalid password' });
}
});
});
}));
因此,用户名策略完全正常,但电子邮件不是。我甚至在用户名和电子邮件策略中都留下了console.log(),以查看策略返回的内容。用户名策略返回有关用户的所有信息,而电子邮件策略返回
假
。我不知道为什么网站会这样做,到目前为止我看到的解决方案都没有。
我在另一篇文章中看到的一个解决方案建议我只使用
findOne({email: email}, function(err, user){
});
使用电子邮件登录以查找用户的选项,但它根本没有运行。
以下是我用来从用户那里获取输入的Jade文件:
extends layout
block content
h1 Login
form(action= '/login', method='post')
p Email
br
input#email(type='text',value='',placeholder='@',name='email')
p Password
br
input#password(type='password',value='',placeholder='Password',name='password')
input(type='submit') Submit
这是POST输入:
// POST /login
// This is an alternative implementation that uses a custom callback to
// acheive the same functionality.
exports.postlogin = function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err) }
if (!user) {
req.session.messages = [info.message];
return res.redirect('/login')
}
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/');
});
})(req, res, next);
};
这到底是怎么回事?通过电子邮件,它应该是完美的。此外,既然我正在问一个问题,如何在有人注册后确认电子邮件?
答案 0 :(得分:36)
在我看来,您刚刚将LocalStrategy回调中的参数名称更改为" email"。 Passport没有自动知道该字段被命名为电子邮件,但您必须告诉它。
默认情况下,LocalStrategy希望在名为username和password的参数中查找凭据。如果您的网站更喜欢以不同方式命名这些字段,则可以使用选项更改默认值。
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'passwd'
},
function(username, password, done) {
// ...
}
));
答案 1 :(得分:2)
作为无法使用上述解决方案的人(如我)的补充,请尝试以下方法:
passport.use(
new LocalStrategy(
{
passReqToCallback: true,
},
(request, username, password, next) => {
User.findOne({ email: username })
...
软件包版本(截至今天): 护照:“ ^ 0.4.1”, 本地护照:“ ^ 1.0.0”
答案 2 :(得分:0)
护照有点复杂。我有同样的问题,我所做的就是在我的视图(.ejs)上,而不是将输入命名为“email”我只是将其重命名为“username”,因为那是护照所期待的。
电子邮件
谢谢!
答案 3 :(得分:0)
如果您是 NestJs 的新手并且想知道如何实现上述目标。您可以像这样在 super()
方法中传递配置选项:
super({
usernameField: 'email',
passwordField: 'password'
})