【问题标题】:NodeJS Passport Authentication - always redirected to failure urlNodeJS Passport Authentication - 总是重定向到失败的 url
【发布时间】:2017-01-15 07:36:25
【问题描述】:

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

登录翡翠

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')

用户.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);
  } );
}

【问题讨论】:

    标签: javascript node.js passport.js passport-local


    【解决方案1】:
      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 比较是否正常工作。这些是我现在认为很重要的要点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-30
      • 2018-08-23
      • 1970-01-01
      • 2012-09-22
      • 2016-10-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多