NodeJS Passport身份验证-始终重定向到失败url

NodeJS Passport Authentication - always redirected to failure url

本文关键字:重定向 失败 url Passport 身份验证 NodeJS      更新时间:2023-09-26

无论登录详细信息如何,我都会被重定向到失败url,控制台上没有记录任何内容,也没有显示任何错误。有什么关于为什么会发生这种情况的想法吗?

登录Jade

extends layout
block content
  h1 Login
  p Please Login below
  form(method='post', action='/users/login',enctype='multipart/form-data')
    .form-group
      label Username
      input.form-control(name='username', type='text', placeholder='Enter username')
    .form-group
      label Password
      input.form-control(name='password', type='password', placeholder='Enter Password')
    input.btn.btn-default(name='submit', type='submit', value='Login')

User.js

var express = require('express');
var router = express.Router();
var multer = require('multer');
var uploads =  multer({ dest: './uploads' });
var passport = require('passport');
var localStrategy = require('passport-local').Strategy;
var User = require('../models/userModel');
/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});
router.get('/register', function(req, res, next) {
  res.render('register',{ title: 'Register'})
});
router.get('/login', function(req, res, next) {
  res.render('login',{ title: 'Login'})
});
passport.serializeUser(function(user, done) {
  done(null, user.id);
});
passport.deserializeUser(function(id, done) {
  User.getUserById(id, function(err, user) {
    done(err, user);
  });
});
passport.use(new localStrategy(
  function(username, password, done){
    User.getUserByUsername(username, function(err, user){
      if(err) throw err;
      if(!user){
        console.log('Unknown user');
        return done(null, false,{message:'Unkown User'});
      }
      User.comparePassword(password, user.password, function(err, isMatch){
        if(err) throw err;
        if(isMatch){ return done(null, user)}
        else{
          console.log('Invalid password');
          return done(null, false,  {message:'Invalid Password'});
        }
      });
    });
  }
));

router.post('/login', passport.authenticate('local',{failureRedirect:'/users/login',failureFlash: true }), function(req, res){
  console.log('Auth Sucessful');
  req.flash('sucess','Logged in');
  res.redirect('/');
});

module.exports = router;

我的UserModel.js有comparePassword和getUserByUsername。

var mongoose = require('mongoose');
var bcrypt = require('bcrypt');
mongoose.connect('mongodb://localhost/nodeauth');
var db = mongoose.connection;
//Schema
var UserSchema = mongoose.Schema({
  username:{
    type:String,
    index:true
  },
  password:{
    type:String,
    bcrypt :true,
    required: true
  },
  email:String,
  name:String,
  profileImage:{
    type:String
  }
}); 

var User = module.exports = mongoose.model('User',UserSchema);
module.exports.comparePassword = function(candidatePassword, hash , callback){
  bcrypt.compare(candidatePassword, hash, function(err, ismatch){
    if(err) return callback(err);
    callback(null, ismatch);
  });
}
module.exports.getUserByUsername = function(username, callback){
  var query = {username : username};
  User.findOne(query, function(err, user) {
    callback(err, user);
  }); 
}
module.exports.getUserById = function(id, callback){
  User.findById(id,callback);
}
module.exports.createUser = function(newUser,callback){
  bcrypt.hash(newUser.password, 10, function(err, hash){
    if(err) throw err;
    //Set hash password
    newUser.password = hash;
    newUser.save(callback);
  } );
}
  function(username, password, done){
    User.getUserByUsername(username, function(err, user){
      if(err) throw err;
      if(!user){
        console.log('Unknown user');
        return done(null, false,{message:'Unkown User'});
      }
      User.comparePassword(password, user.password, function(err, isMatch){
        if(err) throw err;
        if(isMatch){ return done(null, user)}
        else{
          console.log('Invalid password');
          return done(null, false,  {message:'Invalid Password'});
        }
      });
    });
  }

这就是你的问题应该发生的地方。自if(err) throw err;如果存在,并且您没有出现错误,那么无论发生什么都很可能不被视为错误,所以一定是您的逻辑在某一点上失败了。

您应该测试密码是否正确返回,或者UserModel中的bcrypt比较是否正常工作。这些是我目前认为至关重要的要点。