Node JS: Вход не работает

Я использовал Express поверх Node с шаблоном .hbs templating. Я использую паспорт для проверки конкретного пользователя. База данных, которую я использовал в MongoDB.

Здесь мой маршрут регистрации:

var express = require('express');
var router = express.Router();
var passport = require('passport');
var userServices = require('../services/user-services');

router.get('/', function(req, res, next) {

    var vm = {
    title: 'Join this web',
    };
  res.render('signup', vm);
});

router.post('/', function(req, res, next) {
  userServices.addUser(req.body, function(err){
    if(err){
    var vm = {
      title: 'Create an account',
      input: req.body,
      error: err
    };
    delete vm.input.password;
    return res.render('signup', vm);
  }
      req.login(req.body, function(err) {
      res.redirect('/profile');
    });
   });
});
router.post('/login', passport.authenticate('local'), function(req, res, next){
  res.redirect('/profile');
});

module.exports = router;

Вот мой логин:

var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
  if (req.user) {
    return res.redirect('/profile');
  }
  res.render('login', { title: 'Login' });
});

module.exports = router;

Я определил конфигурацию своего паспорта в моем паспортном файле:

module.exports=function(){
    var passport = require('passport');
    var passportLocal = require('passport-local');
    var userServices = require('../services/user-services');

    passport.use(new passportLocal.Strategy({usernameField: 'email'}, function(email, password, next) {
        userServices.findUser(email, function(err, user){
            if(err){
                return next(err);
            }
            if(!user||user.password!==password){
                return next(null, null);
            }
            next(null, user);
        });
    }));

    passport.serializeUser(function(user, next){
        next(null, user.email);
    });

    passport.deserializeUser(function(user, next){
        userServices.findUser(email, function(err, user){
            next(err, user);
        });
    });
};

Кроме того, вот мой app.js с кодом, связанным с паспортом:

var passportConfig = require('./auth/passport-config');
passportConfig();

var app = express();

app.use(expressSession({
    secret:'trawel man',
    saveUninitialized: false,
    resave: false
}));

app.use(passport.initialize());
app.use(passport.session());

Вот трассировка стека ошибки, которую я получаю:

Error: Not Found

at C:\Users\James\MEAN\app.js:56:15
at Layer.handle [as handle_request] (C:\Users\James\MEAN\node_modules\express\lib\router\layer.js:82:5)
at trim_prefix (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:302:13)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:270:7
at Function.proto.process_params (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:321:12)
at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:261:10)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:603:15
at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:246:14)
at Function.proto.handle (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:166:3)
at router (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:35:12)
at Layer.handle [as handle_request] (C:\Users\James\MEAN\node_modules\express\lib\router\layer.js:82:5)
at trim_prefix (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:302:13)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:270:7
at Function.proto.process_params (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:321:12)
at next (C:\Users\James\MEAN\node_modules\express\lib\router\index.js:261:10)
at C:\Users\James\MEAN\node_modules\express\lib\router\index.js:603:15

Это то, что я получил на своей серверной консоли:

POST /login 404 32.453 ms - 2847

Я понятия не имею, почему это не работает. Я новичок в Node. Кто-то помогает мне.

Ответ 1

// process the login form
router.post('/login', passport.authenticate('local-login', {
    successRedirect: '/',       // redirect to the home page
    failureRedirect: '/login', // redirect back to the login page if there is an error
    failureFlash: true          // allow flash messages
}));

Это код паспорта, который вы должны использовать: (вам нужно добавить путь к вашей пользовательской схеме)

// load all the things we need
var LocalStrategy    = require('passport-local').Strategy;

// load up the user model
var User       = require('....'); //enter here user path schema

 // load the auth variables


 module.exports = function(passport) {

// =========================================================================
// passport session setup ==================================================
// =========================================================================
// required for persistent login sessions
// passport needs ability to serialize and unserialize users out of session

// used to serialize the user for the session
passport.serializeUser(function(user, done) {
    done(null, user.id);
});

// used to deserialize the user
passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

// =========================================================================
// LOCAL LOGIN =============================================================
// =========================================================================
passport.use('local-login', new LocalStrategy({
    // by default, local strategy uses username and password, we will override with email
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
},
function (req, email, password, done) {
    if (email)
        email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

    // asynchronous
    process.nextTick(function() {
        User.findOne({ 'local.email' : email }, function (err, user) {
            console.log(user);
            // if there are any errors, return the error
            if (err)
                return done(err);

            // if no user is found, return the message
            if (!user)
                return done(null, false, req.flash('loginMessage', 'No user found.'));

            if (!user.validPassword(password))
                return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));

            // all is well, return user
            else
                return done(null, user);
        });
    });

}));
};

EDIT: Я добавил вам пример к User Schema в mongoDB, поэтому вам будет проще изменить код:

    // load the things we need
var mongoose = require('mongoose');
var bcrypt   = require('bcrypt-nodejs');


var userSchema = mongoose.Schema({

    local            : {
        email        : String,
        password     : String
    }
});

// generating a hash
userSchema.methods.generateHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

// checking if password is valid
userSchema.methods.validPassword = function(password) {
    return bcrypt.compareSync(password, this.local.password);
};

// create the model for users and expose it to our app
module.exports = mongoose.model('User', userSchema);
//module.exports = userSchema;
module.exports.schema = userSchema;

Ответ 2

Вам не хватает маршрута для /profile, почему вы вызываете свой последний маршрут "Not Found".

Добавьте маршрут с помощью

router.get('/profile', function (req, res, next) {
    var vm = { name : req.user ? req.user.name:null };
    res.render('profile', vm); 
})

и эта ошибка не будет выбрана

ИЗМЕНИТЬ:

Похоже, вы получаете ошибку при попытке входа в систему, а не после. Это потому, что ваш маршрут для POST login находится в неправильном файле. В файле логина входа добавьте следующее:

router.post('/', passport.authenticate('local'), function(req, res, next){
  res.redirect('/profile');
});

(Обязательно импортируйте зависимости)

И удалите это router.post('/login'... из маршрута регистрации.