ExpressJS: невозможно войти по паспорту. js - PullRequest
1 голос
/ 21 апреля 2020

Я впервые использую passport в проекте expressJS.

Однако я столкнулся с проблемой. Когда я пытаюсь войти в систему, я отправляю свои данные, и приложение всегда не может аутентифицироваться.

Мой app.js файл включает в себя следующие данные, связанные с паспортом:

// Passport Config
require('./config/passport')(passport);

// Login
app.post('/users/login', (req, res, next) => {
   passport.authenticate('local', {
         successRedirect: '/dashboard',
         failureRedirect: '/users/login',
         failureFlash: false
   })(req, res, next);
});

// Passport middleware
app.use(passport.initialize());
app.use(passport.session());

// Express body parser
app.use(express.urlencoded({ extended: false }));

У меня также есть файл passport.js, который находится внутри каталога config (/config/passport.js)

Внутри этого файла я создал свою LocalStrategy, которая отвечает за успех или неудачу аутентификация при входе в систему.

Внутри файла passport.js, который у меня есть:

const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";`

module.exports = function(passport) {
    console.log('check if printing-- it is printing')
    passport.use(
        new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
            console.log('check if printing-- it is not printing')
            // Match user
            MongoClient.connect(url, function(err, db) {
                var dbo = db.db("chat_db");
                dbo.collection('users').findOne({
                email: email
                }).then(user => {
                    if (!user) {
                        console.log('That email is not registered');
                    //   return done(null, false, { message: 'That email is not registered' });
                }

                // Match password
                bcrypt.compare(password, user.password, (err, isMatch) => {
                    if (err) throw err;
                    if (isMatch) {
                        return done(null, user);
                    } else {
                        return done(null, false, { message: 'Password incorrect' });
                    }
                });
                });
            })
        })
    );

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

   passport.deserializeUser(function(id, done) {
      MongoClient.connect(url, function(err, db) {
        var dbo = db.db("chat_db");
        dbo.collection('users').findById(id, function(err, user) {
            done(err, user);
        });
      });
   })
};

Я считаю, что проблема существует внутри части passport.use(...) кода, но я не могу понять это вне. Я поместил два console.log() теста внутри кода, чтобы проверить, какие методы вызываются или нет. Я также протестировал часть dbo.collection('users').findOne(), которая находит данные с предоставленной электронной почтой, поэтому я полагаю, с этим проблем нет.

Может кто-нибудь помочь мне с этим? Я не знаю, почему не вызывается passport.use(...), и поэтому вход в систему всегда терпит неудачу и всегда перенаправляет меня на страницу входа, а не на панель мониторинга. Ваша помощь будет высоко ценится, спасибо за ваше время.

1 Ответ

0 голосов
/ 21 апреля 2020

Вы загружаете промежуточные программы для вашего паспорта / парсера после вашего маршрута, поэтому они никогда не будут вызваны для вашего маршрута входа в систему. Они должны быть определены в первую очередь. Также кажется, что вы определяете свой маршрут иначе , чем предлагается в документации , и его можно упростить следующим образом:

// Passport Config
require('./config/passport')(passport);

// Passport middleware
app.use(passport.initialize());
app.use(passport.session());

// Express body parser
app.use(express.urlencoded({ extended: false }));

// Login
app.post('/users/login',
  passport.authenticate('local', {
    successRedirect: '/dashboard',
    failureRedirect: '/users/login',
    failureFlash: false
  })
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...