Passport.authenticate未在Node / MongoDB应用程序中调用

时间:2018-12-27 22:05:39

标签: node.js mongodb

我正在尝试在Node / MongoDB应用程序中设置本地用户身份验证。

这是有问题的文件。我无法解雇passport.authenticate('local')。我使用next()尝试了不同的变体,然后调用passport.authenticate作为单独的回调,但仍未注册。

我也在使用https,并且已经在正确使用bodyparser

...

router.post('/join', function(req, res, next) {
  const {email, password} = req.body;

  User.register(new User({
    username:email,
    email: email
  }),password,function(err,account){
    if (err){
      console.log('err',err);
    }
    console.log('here') // works

    passport.authenticate('local', function(err,user,info){
      console.log('am i here'); // does not work
      res.redirect('/');
    });
  });
});

作为参考,这是我的其他安装文件。

server.js
...

app.use(session({
  secret: 'ama-app',
  resave: false,
  saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());

app.use('/', routes);
var User = require('./models/User');

passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

下面我有用户模式的文件设置

models/User.js

var mongoose = require('mongoose');
var passportLocalMongoose = require('passport-local-mongoose');

const UserSchema = new mongoose.Schema({
  username:String,
  email: String,
  password: String
});

UserSchema.plugin(passportLocalMongoose);
var User = mongoose.model('User', UserSchema);

module.exports = User;

2 个答案:

答案 0 :(得分:0)

我最终使用docs中的这段代码解决了这个问题。

router.post('/join', function(req, res, next) {
  const {email, password} = req.body;

  User.register(new User({
    username:email,
    email: email
  }),password,function(err,account){
    if (err){
      console.log('err',err);
    }
    passport.authenticate('local', function(err, user, info) {
      if (err) {
        return next(err);
      }
      if (!user) {
        // redirects successfully
        return res.redirect('/');
      }

    })(req, res, next);
  });
});

答案 1 :(得分:-1)

重要的是要记住,归根结底,Express是一个中间件应用程序。在POST端点中使用护照的地方对我来说真的没有意义。通常,我会将Passport用作保护端点的中间件,但不能直接在我正在编写的端点中使用。

据我所知,您正在尝试在新用户注册时立即登录。 According to the docs,最惯用的方法是使用req.login()

以下是我希望您做的事情:

router.post('/join', function(req, res, next) {
  const {email, password} = req.body;

  User.register(new User({
    username:email,
    email: email
  }),password,function(err,account){
    if (err){
      console.log('err',err);
      // IMPORTANT: need to return here
      return next(err);
    }

    req.login(account, function(err) {
      if (err) { return next(err); }
      return res.redirect('/');
    });
  });
});