Узел проблемы аутентификации.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:
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 ответ:
Оказалось, что Nginx не имеет к этому никакого отношения. При непосредственном доступе с помощью example. com: 3000 проблема также иногда возникала.
Я заметил, что в какой-то момент браузер сказал, что я посещаю example.com и выставляла напоказ example.com/login. Я не смог найти никаких доказательств этого в интернете, но я подозреваю, что Safari/IE9 кэширует перенаправленную страницу и связывает ее с исходным URL. Итак, вот сюжетная линия того, что происходит дальше.
- пользователь переходит к example.com/
- перенаправляется на example.com/login (кэш браузера example.com/ но сохраняет страницу входа в систему)
- пользователь входит в систему и получает перенаправление на example.com/
- браузер имеет кэш / in и загружает страницу входа в систему.
- необъяснимая ошибка и головные боли для разработчика.
"решается" путем добавления промежуточного ПО, которое не добавляет заголовков кэша при запросе/.
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(); }