Паспорт Node.js не авторизуется при входе - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь реализовать простую страницу входа и регистрации пользователя для моего приложения.

Страница регистрации работает, и все правильно хранится в mongodb.Однако, когда я пытаюсь войти в систему, это, кажется, не работает.Предполагается, что перенаправить на мою корневую страницу, но это не будет делать.Он всегда перенаправляет обратно в / users / login

Я просматривал учебное пособие онлайн, поэтому я не понимаю, почему это не работает.Вот соответствующие файлы.

user.js file

const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const passport = require('passport');

let User = require('../models/user');

// Load register form
router.get('/register', function(req, res) {
    res.render('register', {
        title  : 'Register',
        errors : req.flash('success')
    });
});

// Submit register form
router.post('/register', function(req, res) {
// Get the fields from the form
const firstname = req.body.firstname;
const lastname = req.body.lastname;
const email = req.body.email;
const pass = req.body.pass;
const pass2 = req.body.pass2;

// Verify body is not empty.
req.checkBody('firstname', 'First name is required').notEmpty();
req.checkBody('lastname', 'Last name is required').notEmpty();
req.checkBody('email', 'Email is required').notEmpty();
req.checkBody('email', 'Email is not valid').isEmail();
req.checkBody('pass', 'Password is required').notEmpty();
req.checkBody('pass2', 'Passwords do not match.').equals(req.body.pass);

// Check for errors
let errors = req.validationErrors();
if (errors) {
    res.render('register', {
        errors:errors
    });
} else {
    // Create new user object
    let newUser = new User({
        firstname:firstname,
        lastname:lastname,
        email:email,
        pass:pass
    });

    // Hash the password for security.
    bcrypt.genSalt(10, function(err, salt){
        bcrypt.hash(newUser.pass, salt, function(err, hash) {
            if (err) {
                console.log(err);
            }
            newUser.pass = hash;
            newUser.save(function(err) {
                if (err) {
                    console.log(err);
                    return;
                } else {
                    console.log("Successful creation.")
                    req.flash('success', 'Account creation successful!');
                    res.redirect('/users/login');
                }
            });
        });
    })
}
});

// Load login form
router.get('/login', function(req, res){
    res.render('login');
});

// Submit login form
router.post('/login', function(req, res, next) {
    passport.authenticate('local', {
        successRedirect: '..',
        failureRedirect: '/users/login',
        failureFlash: true
    })(req, res, next);
});

module.exports = router;

passport.js file

const LocalStrategy = require('passport-local').Strategy;
const passport = require('passport');
const User = require('../models/user');
const config = require('../config/database');
const bcrypt = require('bcryptjs');

// User Authentication
module.exports = function(passport){
    console.log("Made it intro str");
    passport.use(new LocalStrategy(function(email, pass, done){
        // Match username
        let query = {email:email};
        User.findOne(query, function(error, user){
            if (error){
                console.log("error");
                return done(error);
            }
            if (!user) {
                console.log("No user found");
                return done(null, false, {message: 'No user found.'});
            }

            bcrypt.compare(pass, user.pass, function(error, isMatch) {
                if (error) {
                    console.log("error2");
                    return done(error);
                }
                if (isMatch) {
                    console.log("Matching password");
                    return done(null, user);
                } else {
                    console.log("Wrong password");
                    return done(null, false, {message: 'Invalid password.'});
                }
            });
        });
    }));

    passport.serializeUser(function(user, done) {
        done(null, user.id);
    });

    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });
}

App.js

const createError = require('http-errors');
const express = require('express');
const path = require('path');
const logger = require('morgan');
const session = require('express-session');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const expressValidator = require('express-validator');
const config = require('./config/database');
const flash = require('connect-flash');
const passport = require('passport');


/* Connect to Database */
mongoose.connect(config.database, { useNewUrlParser: true });
let db = mongoose.connection;

// Check connection.
db.once('open', function(){
  console.log('Connected to MongoDB.');
})

// Check DB error.
db.on('error', function(error){
  console.log(error);
});

/* Initialize app */
var app = express();

/* Bring in models for database */
let User = require('./models/user');

// Body Parser Middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// Load the view engines
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

// Set public folder
app.use(express.static(path.join(__dirname, 'public')));

app.use(expressValidator());

// Keep users session
app.use(session({
  secret: 'secret',
  resave: true,
  saveUninitialized: true,
  cookie: { maxAge: 60000 }
}));


app.use(require('connect-flash')());
app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  next();
});

// Express Validator Middleware
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));

// Passport config
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session());

// Load homepage
app.get('/', function(req, res) {
  res.render('index', {
    title: 'Index',
  })
})

// Define routes
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/user');
app.use('/', indexRouter);
app.use('/users', usersRouter)

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

;

module.exports = app;

1 Ответ

0 голосов
/ 28 ноября 2018

Я считаю, что проблема в вашем файле passport.js ... По умолчанию LocalStrategy ожидает найти учетные данные в параметрах с именами username и password.Вы должны изменить это ... что-то вроде этого:

const localOptions = { usernameField: 'email', passwordField: 'pass' };

passport.use(new LocalStrategy(localOptions, function (email, pass, done) {
  // Match username
  let query = { email: email };
  User.findOne(query, function (error, user) {
    // etc etc...
  });
}));

Ссылка на документы (внизу страницы ...): http://www.passportjs.org/docs/username-password/

...