Слишком много перенаправлений при проверке req.IsAuthenticated

#node.js #express #session-cookies #passport.js

#node.js #экспресс #сеансовые файлы cookie #passport.js

Вопрос:

Мой код каким-то образом вызывал цикл перенаправления. Пользователи, посещающие /account должны быть перенаправлены /login , если они не аутентифицированы, и наоборот.

Я использую ensureAuth как промежуточное программное обеспечение, чтобы проверить, что пользователь вошел в систему. Кажется, что он получает объект запроса ( req ), но req.user объекта нет, и isAuthenticated() он всегда возвращает false . Тем не менее, в /login маршруте тот же isAuthenticated() метод возвращает true, если пользователь вошел в систему. Это источник цикла перенаправления.


routes.js

 var ensureAuth = function(req,res,next){
  if (req.isAuthenticated()) { // This always comes out false, even if the user is logged in!
    next();
  } else {
    req.flash('warning', 'You have to log in to do that.  ');
    res.redirect('/login');
  }
};

router.route('/account').get( ensureAuth, function(req,res){
  res.render('account.html');
})
  

auth.js

 app.route('/login').get( function(req,res){
  if (req.isAuthenticated()){
    res.redirect('/account'); }
  else { res.render('login.html'); }
})
  

main.js

 // Routes
app.use('/files', express.static(__dirname '/public'));
app.use('/', require('./config/routes.js') );

// Auth
require('./config/passport.js')(passport);
app.use(passport.initialize());
app.use(passport.session());
require('./config/auth.js')(app, passport);
  

Ответ №1:

Это может помочь другим, которые сталкиваются с проблемами, когда req.isAuthenticated() всегда возвращается false или req.user всегда пусто.

В принципе, чтобы получить доступ к сеансу аутентификации, мне просто нужно было позвонить routes.js после app.use(passport.session()) .

 // Auth
require('./config/passport.js')(passport);
app.use(passport.initialize());
app.use(passport.session());
require('./config/auth.js')(app, passport);

// Routes
app.use('/files', express.static(__dirname '/public'));
app.use('/', require('./config/routes.js') );