Форма не отправлена ​​после перенаправления (Node.js) - PullRequest
1 голос
/ 07 марта 2019

У меня есть базовый HTML-сайт с бэкэндом NodeJS.

В моем бэкэнде NodeJS у меня есть поток аутентификации на основе паспорта, который корректно работает с конечной точкой API / api / login для запуска аутентификации.

В моем HTML у меня есть базовая форма, которая отправляет электронную почту / пароль пользователя:

<form action="api/login" method="POST" class="cozy">
  <input type="text" id="email" name="email" class="form-control form-control-rounded" placeholder="Your registered email" required>
  <input type="password" id="password" name="password" class="form-control form-control-rounded" placeholder="Your password" required>
  <button type="submit" class="btn btn-accent btn-rounded">Login
	  <i class="fas fa-long-arrow-alt-right ml-2"></i>
	</button>
</form>

Если аутентификация прошла успешно, моя конечная точка NodeJS возвращает статус 302 с заголовком Расположение: /app/index.html, который является страницей "панели мониторинга" моего приложения, которая доступно только после входа в систему.

app.post('/api/login', 
	passport.authenticate('local-login', {
		successRedirect: '/app/index.html',
		failureRedirect: '/login.html'
	})
);

app.get('/app/index.html', ensureAuthenticated, function(req, res) {
	return res.sendFile(path.join(__dirname + '/private/index.html'));
});

Теперь вместо перенаправления на эту страницу мой браузер выполняет запрос XHR для / app / index.html , и моя страница панели мониторинга загружается как содержимое ответа на запрос XHR, а не как мой пользователь. перенаправлен на него.

Кто-нибудь имеет представление о том, что я делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Пожалуйста, удалите .html из вашего маршрута. При паспортной аутентификации вы должны перенаправлять пользователя на маршрут, а не на какой-нибудь файл .html. На маршруте /app/index.html вы используете файл index.html в качестве ответа. Так не должно быть. Вместо этого попробуйте это.

app.post('/api/login', 
    passport.authenticate('local-login', {
      successRedirect: '/app/index',
      failureRedirect: '/login'
  })
);

А за ответ

app.get('/app/index', ensureAuthenticated, function(req, res) {
    return res.sendFile(path.join(__dirname + '/private/index.html'));
});

Надеюсь, это поможет.

0 голосов
/ 07 марта 2019

Похоже, вам нужно обновить тег формы, чтобы использовать метод POST

<form action="api/login" class="cozy" method="POST">

Или, если вы используете на своей странице JavaScript-код на стороне клиента, вы можете перехватитьсобытие отправки формы, позвоните event.preventDefault(), а затем отправьте запрос на сервер с помощью fetch или jquery или чего-либо еще.

...