使用MongoDB进行身份验证

时间:2018-01-22 16:54:45

标签: javascript node.js mongodb express authentication

我使用身份验证制作了一个简单的Node应用程序。我可以使用表单注册,但我无法使用登录表单登录。

我写了下面的代码。使用这个我可以使用注册路由注册,但我无法登录。此外,我没有收到任何错误,我只是重定向到失败重定向路径。

这是我写的代码

var express         =   require('express'),
app             =   express(),
bodyParser      =   require('body-parser'),
mongoose        =   require('mongoose'),
User            =   require("./views/models/user"),
passport        =   require('passport'),
flash           =   require('connect-flash'),
morgan       = require('morgan'),
cookieParser = require('cookie-parser'),
session      = require('express-session'),
expressValidator = require('express-validator'),
LocalStrategy = require('passport-local').Strategy;



mongoose.connect("mongodb://localhost/travelogue");


// set up our express application
app.use(morgan('dev')); // log every request to the console
app.use(cookieParser()); // read cookies (needed for auth)
app.use(bodyParser()); // get information from html forms


// required for passport
app.use(bodyParser.urlencoded({extended :true}));
app.use(bodyParser.json());
app.use(passport.initialize()); 
app.use(passport.session());
app.use(flash());


app.use(require('express-session')({
 secret : "Adish",
 resave : false,
 saveUninitialized : false,

 }));


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


   app.use(express.static('public'));
   app.set("view engine","ejs");

//routes


 app.get("/Login",function(req,res){
 res.render("login");

 });

 app.get("/Signup",function(req,res){

 res.render("signup");

 });

app.get("/",function(req,res){
res.render("index");

});

// we will use route middleware to verify this (the isLoggedIn 
function)
/*app.get('/profile', isLoggedIn, function(req, res) {
    res.render('profile.ejs', {
        user : req.user // get the user out of session and pass to 
 template
    });
 });*/


 app.get("/logout",function(req,res){

 req.logout();
 res.redirect("/");
 });


 // Express Validator
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
  };
  }
}));


 // process the signup form

 app.post('/Signup', function(req, res){
 var firstname = req.body.firstname;
 var lastname = req.body.lastname;
 var username = req.body.username;
 var email = req.body.email;
 var password = req.body.password;
 var gender = req.body.gender;

// Validation

req.checkBody('email', 'Email is required').notEmpty();
req.checkBody('email', 'Email is not valid').isEmail();
req.checkBody('username', 'Username is required').notEmpty();
req.checkBody('password', 'Password is required').notEmpty();

var errors = req.validationErrors();

if(errors){
    res.render('signup',{
        errors:errors
    });
} else {
    var newUser = new User({
        firstname: firstname,
        lastname : lastname,
        username : username,
        email    : email,
        password : password,
        gender :  gender
    });

    User.createUser(newUser, function(err, user){
        if(err) throw err;
        console.log(user);
    });

    req.flash('success_msg', 'You are registered and can now 
    login');

    res.redirect('/login');
   }
 });



 passport.use(new LocalStrategy({
 usernameField: 'email',
 passwordField: 'password'
  },

 function(username, password, done) {
 User.findOne({ username: username }, function(err, user) {
  if (err) { return done(err); }
  if (!user) {
    return done(null, false, { message: 'Incorrect username.' });
  }
  if (!user.validPassword(password)) {
    return done(null, false, { message: 'Incorrect password.' });
  }
  return done(null, user);
  });
 }
));




 app.post('/login', passport.authenticate('local', {
    successRedirect : '/profile', // redirect to the secure profile 
    section
    failureRedirect : '/login', // redirect back to the signup page 
    if there is an error
    failureFlash : true // allow flash messages
 }));


 app.get('/profile',function(req,res){

    res.render('profile.ejs');


 });


app.listen(process.env.PORT,process.env.IP,function(){

console.log("Server is running !");
});




// route middleware to make sure a user is logged in
function isLoggedIn(req, res, next) {

// if user is authenticated in the session, carry on 
if (req.isAuthenticated())
    return next();

// if they aren't redirect them to the home page
res.redirect('/');
 }

这是用于注册(user.js)的userSchema:

  var mongoose = require('mongoose');
  var bcrypt = require('bcryptjs');

  // User Schema
  var UserSchema = mongoose.Schema({
    firstname : String,
    lastname : String,
    username : {type :String, unique : true},
    email : String,
    password : String,
    gender : String,
  });

  var User = module.exports = mongoose.model('User', UserSchema);

   module.exports.createUser = function(newUser, callback){
    bcrypt.genSalt(10, function(err, salt) {
        bcrypt.hash(newUser.password, salt, function(err, hash) {
            newUser.password = hash;
            newUser.save(callback);
            if(err)
            console.log(err);
        });
    });
  };

 module.exports.getUserByUsername = function(username, callback){
    var query = {username: username};
    User.findOne(query, callback);
 };

 module.exports.getUserById = function(id, callback){
    User.findById(id, callback);
 };

 module.exports.comparePassword = function(candidatePassword, hash, 
 callback){
    bcrypt.compare(candidatePassword, hash, function(err, isMatch) {
        if(err) throw err;
        callback(null, isMatch);
    });
 };

0 个答案:

没有答案