Passport.authenticate不在Node/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;

最终通过使用文档中的这段代码解决了这个问题。

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);
  });
});

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

据我所知,您正在尝试在新用户注册时立即登录。根据文档,最惯用的方法是使用 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('/');
    });
  });
});

相关内容

  • 没有找到相关文章

最新更新