Узел проблемы аутентификации.js с паспортом и Nginx в качестве прокси-сервера


Я запускаю приложение узла, которое использует Passport.js для аутентификации на порту 3000. Nginx используется в качестве прокси-сервера для прослушивания на порту 80 и прокси-передачи запросов на порт 3000. Паспорт.js используется для аутентификации пользователей.

Протокол аутентификации выглядит следующим образом: Запросы пользователя example.com и перенаправляется на example.com/login если он не вошел в систему. После успешного входа в систему пользователь снова перенаправляется на example.com.

  • Проблема возникает когда я пытаюсь войти в систему с помощью Safari 6 на Ipad и в Internet Explorer 9 (подозревается, что клиент имеет ту же проблему). Происходит то, что приложение перенаправляет на example.com/login вместо того, чтобы example.com/ при использовании правильных учетных данных.

  • Проблема не возникает, например, в Chrome 40.

  • проблема не возникает, когда nginx избегается с помощью example. com: 3000 в Safari.
  • что еще хуже: иногда это действительно работает без видимых причин. причина.
Я подозреваю, что это как-то связано с Nginx и порядком, в котором запрашиваются файлы.

Конфигурация Nginx:

server {
    listen 80;
    location / {
            proxy_pass http://127.0.0.1:3000;
    }
}

Часть кода приложения:

app.post('/api/login', function (req, res, next) {
passport.authenticate('local-login', function (err, user, info) {
  if (err) {
    return next(err);
  }
  if (!user) {
    return res.status(401).send(info);
  }
  req.logIn(user, function (err) {
    if (err) {
      return next(err);
    }
    return res.send({
      username: user.username
    });
  });
})(req, res, next);
});

app.get('/', isLoggedIn, function (req, res) {
  res.sendFile(__dirname + '/client/views/index.html');
});


function isLoggedIn(req, res, next) {
  if (!req.isAuthenticated()) {
    res.redirect('/login');
  } else {
    next();
  }
}
Мне интересно, может ли кто-нибудь помочь мне с этим. Я буду рад предоставить дополнительный код или объяснение, где это необходимо.
1 3

1 ответ:

Оказалось, что Nginx не имеет к этому никакого отношения. При непосредственном доступе с помощью example. com: 3000 проблема также иногда возникала.

Я заметил, что в какой-то момент браузер сказал, что я посещаю example.com и выставляла напоказ example.com/login. Я не смог найти никаких доказательств этого в интернете, но я подозреваю, что Safari/IE9 кэширует перенаправленную страницу и связывает ее с исходным URL. Итак, вот сюжетная линия того, что происходит дальше.

  1. пользователь переходит к example.com/
  2. перенаправляется на example.com/login (кэш браузера example.com/ но сохраняет страницу входа в систему)
  3. пользователь входит в систему и получает перенаправление на example.com/
  4. браузер имеет кэш / in и загружает страницу входа в систему.
  5. необъяснимая ошибка и головные боли для разработчика.

"решается" путем добавления промежуточного ПО, которое не добавляет заголовков кэша при запросе/.

app.get('/', isLoggedIn, noCache, function (req, res) {
  res.sendFile(__dirname + '/client/views/index.html');
});

function noCache(req, res, next) {
  res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
  res.header('Expires', '-1');
  res.header('Pragma', 'no-cache');
  next();
}