Логин аутентифицирует пользователя с любым паролем - PullRequest
0 голосов
/ 30 января 2020

У меня есть простая форма входа, которую я создал. Кажется, он аутентифицирует любого существующего пользователя, если в поле пароля что-то есть. Очевидно, это огромный недостаток безопасности. Я новичок в том, что имею в виду стек, и использование паспорта для аутентификации пользователей кажется простым, но я не уверен, что сделал это неправильно.

Это мой бэкэнд-код с использованием паспорта js:

app. js

const passport = require('passport');
require('./config/passport');
app.use(passport.initialize());

маршруты / индексы. js

const ctrlAuth = require('../controllers/authentication');
router.post('/login', ctrlAuth.login);

контроллеры / аутентификация. js

module.exports.login = function(req, res) {

  passport.authenticate('local', function(err, user, info){
    let token;

    // If Passport throws/catches an error
    if (err) {
      res.status(404).json(err);
      return;
    }

    // If a user is found
    if(user){
      token = user.generateJwt();
      res.status(200);
      res.json({
        "token" : token
      });
    } else {
      // If user is not found
      res.status(401).json(info);
    }
  })(req, res);

};

И наконец, мой конфигурационный файл

config / passport. js

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const User = mongoose.model('User');

passport.use(new LocalStrategy({
    usernameField: 'email'
  },
  function(username, password, done) {
    User.findOne({
      email: username
    }, function(err, user) {
      if (err) {
        return done(err);
      }
      //Return if user not found in database
      if (!user) {
        return done(null, false, {
          message: 'User not found'
        });
      }
      //Return if password is wrong
      if (!user.validPassword(password)) {
        return done(null, false, {
          message: 'Password is wrong'
        });
      }
      //If credentials are correct, return the user object
      return done(null, user);
    });
  }
));

Я считаю, что сузил ошибку до функции validPassword, где я мог неправильно использовать bcrypt.

userSchema.methods.validPassword = function(password){
  return bcrypt.compare(password, this.hash);
};

1 Ответ

0 голосов
/ 31 января 2020

Я сузил проблему до метода validPassword и обнаружил, что неправильно использовал bcrypt. Изменено на

userSchema.methods.validPassword = function(password){
  return bcrypt.compareSync(password, this.hash);
};

Имеет больше смысла после просмотра документов для bcrypt https://github.com/kelektiv/node.bcrypt.js#readme

...