无法使用带有护照本地nodejs的电子邮件进行身份验证。请参阅几个示例

时间:2016-09-28 05:08:57

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

我一直在尝试使用电子邮件和密码来使用本地护照进行身份验证。当我使用用户名时,我有类似的代码,它工作正常。通过电子邮件,我做了一些更改,但没有任何工作。在'post'类型的端点'/ login'处,users.js中的条件!用户条件(如下面显示为第二个代码片段)以某种方式执行。它甚至没有进入passport.use。以下是代码: - 在user.js(模型文件)中,

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

//user schema
var UserSchema=mongoose.Schema({
    phone: {
        type:String,        

    },
    email:{
        type: String,
        index:{unique:true}
    },
    password:{
        type: String
    },
    firstname:{
        type: String
    },
    lastname:{
        type: String
    } 
});
var User=module.exports = mongoose.model('User',UserSchema);


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

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

}

在users.js中(我指定路线):

var express = require('express');
var router = express.Router();
var bodyParser=require('body-parser');
var User=require('../models/user');
var passport=require('passport');
var localStrategy=require('passport-local').Strategy;

router.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { 
      return next(err);
    }
    if (!user) {   /*this is where the problem is this code executes everytime*/
      return res.send('User not found'); 
    }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.json(user);
    });
  })(req, res, next);
});

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

//for sessions
passport.deserializeUser(function(id, done) {
  User.getUserById(id, function(err, user) {
    done(err, user);
  });
});

//this doesnt seem to work
passport.use(new localStrategy({usernameField:'email', passwordField:'password'},function(email,password,done){
    User.getUserByUsername(email, function(err,user){
      if(err) throw err;
      if(!user){
        return done(null,false,{message: 'User not found'});
      }

      User.comparePassword(password, user.password, function(err, isMatch){
        if(err) return done(err);
        if(isMatch){
          return done(null, user);
        }
        else{
          return done(null,false,{message: 'Password doesnt match our records'});
        }
      });
    });

  }));

请注意,此前没有前端。我只是用邮递员来测试我的apis。

1 个答案:

答案 0 :(得分:0)

此代码适用于电子邮件。问题是我还有另一个名为admin.js和admins.js的文件,它与用户和用户执行相同的任务。但是,admin使用用户名。我有相同的passport.use代码管理员但是,用户试图访问该文件而不是当前的文件。删除管理员代码后,一切正常。