Невозможно пройти аутентификацию с помощью электронной почты с локальным паспортом nodejs .. попробовал несколько примеров

Я пытаюсь использовать электронную почту и пароль для аутентификации с использованием локального паспорта. У меня был аналогичный код, когда я использовал имя пользователя, и он работал нормально. В электронной почте я внес некоторые изменения, но ничего не работает. Прямо в конечной точке '/ login' типа 'post' условие пользователя condition! В файле users.js (показано ниже как 2-й фрагмент кода) каким-то образом выполняется. Это даже не вход в паспорт. Использование. Ниже приведен код: - В 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'});
        }
      });
    });

  }));

Обратите внимание, что на этом нет внешнего интерфейса. Я просто использую почтальона, чтобы проверить свои API.


person Rajat Bansal    schedule 28.09.2016    source источник
comment
что вы имеете в виду под не работает? Вы получаете какую-нибудь ошибку? или просто висит казнь? Кстати, у паспорта есть классное промежуточное ПО, которое вы можете использовать   -  person kranthi117    schedule 28.09.2016
comment
По сути, условие if (! User) в коде password.authenticate выполняется независимо от того, что ... даже если адрес электронной почты и пароль верны. Все это работало, когда у меня было отдельное поле для имени пользователя и я проходил аутентификацию с его использованием. Как только я переключился на электронную почту, он не входил в систему. Нет, он не зависает, и я не получаю никаких ошибок. Я просто получаю "пользователь не найден", как в этом! Пользовательском условии   -  person Rajat Bansal    schedule 28.09.2016
comment
может быть пользователь на самом деле null. Вы проверяли ценность электронной почты и пользователя? Попробуйте переименовать поле электронной почты в вашей модели (и все ссылки на него). Это помогло мне с аналогичной проблемой   -  person kranthi117    schedule 28.09.2016
comment
@ kranthi117: Я утешил логин, что пользовательское значение оказалось ложным. Вы говорите, что переименуйте адрес электронной почты в имя пользователя и попробуйте использовать вместо этого адрес электронной почты, но просто назовите его именем пользователя?   -  person Rajat Bansal    schedule 28.09.2016
comment
@abdulbarik: Да, именно так. Это не console.log ничего ... даже слова, которые я использовал как строку ... означает, что он даже не идет туда, я верю   -  person Rajat Bansal    schedule 28.09.2016


Ответы (1)


Этот код отлично работает с электронной почтой. Проблема заключалась в том, что у меня также есть другой файл с именем admin.js и admins.js, который выполняет ту же задачу, что и пользователь и пользователи. Однако администратор использует имя пользователя. У меня был тот же код password.use для администратора, однако пользователи пытались получить доступ к этому файлу, а не к текущему. Как только я удалил код администратора, все заработало.

person Rajat Bansal    schedule 28.09.2016