使用Passport-local的电子邮件.以前的帮助不起作用

Kiv*_*360 12 javascript authentication express passport.js

所以我使用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' });
      }
    });
  });
}));
Run Code Online (Sandbox Code Playgroud)

它来自这个策略:

//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' });
      }
    });
  });
}));
Run Code Online (Sandbox Code Playgroud)

所以用户名策略完全正常,但电子邮件不是.我甚至在用户名和电子邮件策略中都留下了console.log(),以查看策略返回的内容.当电子邮件策略返回时,用户名策略将返回有关用户的所有信息

.我不知道为什么网站会这样做,到目前为止我看到的解决方案都没有.

我在另一篇文章中看到的一个解决方案建议我只使用

 findOne({email: email}, function(err, user){
});
Run Code Online (Sandbox Code Playgroud)

使用电子邮件登录以查找用户的选项,但它根本没有工作.

这是我用来从用户那里获取输入的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
Run Code Online (Sandbox Code Playgroud)

这是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);
};
Run Code Online (Sandbox Code Playgroud)

到底发生了什么事?通过电子邮件,它应该是完美的.此外,既然我正在问一个问题,如何在有人注册后确认电子邮件?

And*_*ren 39

在我看来,你刚刚将LocalStrategy回调中的参数名称更改为"email".Passport不会自动知道该字段已命名为电子邮件,但您必须告诉它.

默认情况下,LocalStrategy希望在名为username和password的参数中查找凭据.如果您的网站更喜欢以不同方式命名这些字段,则可以使用选项更改默认值.

passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'passwd'
  },
  function(username, password, done) {
    // ...
  }
));
Run Code Online (Sandbox Code Playgroud)

资源

  • 我发誓在stackoverflow中有魔力.我试图解决这个问题的时间最长.我甚至试过你之前发布的例子,直到现在都没有用.非常感谢你! (6认同)

小智 9

如果您是 NestJs 的新手,并且想知道如何实现上述目标。您可以在方法中传递配置选项,super()如下所示:

super({ 
  usernameField: 'email',
  passwordField: 'password'
})
Run Code Online (Sandbox Code Playgroud)

来源