Паспорт req.isAuthenticated () не работает - PullRequest
0 голосов
/ 28 июня 2018

Я использую экспресс-сессию и паспорт для аутентификации. Вот мой модуль:

(обновлено)

passport.use(new LocalStrategy(
  function(username, password, done) {
        LamAdmin.findOne({ email: username }, function (err, user) {
            if (err) { return done(err); }
            if (!user) { return done(null, false, { message: 'Incorrect username' }); }
            if (!comparePassword(user.password, password)) { return done(null, false, { message: 'Incorrect password' }); }
            return done(null, user);
        });
  }
));

router.post('/login', passport.authenticate('local',{
    successRedirect: '/p/dashboard',
    failureRedirect: '/p',
    failureFlash: true
}));


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

passport.deserializeUser(function(id, done) {
  LamAdmin.findById(id, function (err, user) {
    done(err, user);
  });
});

function checkAuth(req,res,next) {
    if (req.isAuthenticated()) {
        next();
    } else {
        res.redirect('/p');
    }
}

// //DOES NOT WORK WITH CHECKAUTH MIDDLEWARE
// router.get('/dashboard',(req,res,next)=> {
//      res.render('dashboard');
// });

router.get('/dashboard',checkAuth,(req,res,next)=> {
        res.render('dashboard');
});

checkAuth - это мое промежуточное ПО и idk, почему он всегда возвращает false. Это паспорт и сессионные конфиги в app.js:

//sessions
app.use(session({
  secret: 'secret',
  saveUninitialized: true,
  resave: true,
  cookie: { secure: false } // Remember to set this
}));

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

Что-то не так с моим промежуточным ПО checkAuth?

Или мое перенаправление на панель инструментов?

Заранее спасибо!

1 Ответ

0 голосов
/ 28 июня 2018

Когда вы вызываете метод passport.authenticate (), он использует стратегию для аутентификации пользователя. Если у вас есть пользовательская информация, хранящаяся в локальной БД, вы можете использовать локальную стратегию, которая будет использовать имя пользователя и пароль для аутентификации. Поэтому в вашем app.js добавьте следующее:

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

passport.use(new LocalStrategy(
  function(username, password, done) {
    /* Change this to fetch user info from your db
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (!comparePasswords(user.password, password)) { return done(null, false); }
      return done(null, user);
    }); 
    */
  }
));

Когда пользователь проходит проверку подлинности, вызывается метод serializeUser () с пользовательским объектом, возвращенным из вышеуказанного метода, переданным в качестве аргумента, и express добавляет значение, возвращенное в текущий пользовательский сеанс, в req.session.passport.user

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

При каждом последующем запросе, когда вызывается метод isAuthenticated (), паспорт проверяет, присутствует ли какое-либо значение в req.session.passport.user. Если информация о пользователе присутствует, он вызывает метод deserializeUser (), который добавляет информацию о пользователе к запросу и может быть доступен через req.user

passport.deserializeUser(function(id, done) {
  // Replace it with your db
  User.findById(id, function (err, user) {
    done(err, user);
  });
});
...