У меня проблема с промежуточным программным обеспечением паспорта, когда я аутентифицирую пользователя, он не перенаправляется, я понятия не имею, что не так.
Вот код и весь проект на GitHub:
const express = require("express");
const router = express.Router();
const passport = require("passport");
const genPassword = require("../passwordUtils").genPassword;
const connection = require("../database");
const User = connection.models.User;
// const logRegController = require("../controllers/log-reg-controller");
router.post(
"/login",
passport.authenticate("local", {
successRedirect: "/",
failureRedirect: "/register",
})
);
router.post("/register", async (req, res) => {
const existingUser = await User.findOne({ username: req.body.username });
if (existingUser) return res.json({ message: "User already exists" });
const saltHash = genPassword(req.body.password);
const { salt, hash } = saltHash;
const newUser = new User({
username: req.body.username,
hash: hash,
salt: salt,
});
newUser.save().then((user) => console.info(user));
res.status(201).json({ message: "All good" });
});
module.exports = router;
Вы можете попробовать это с функцией обратного вызова, которая перенаправляет, вы можете сделать это так в соответствии с Документы
router.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/register'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
//If Successful
return res.redirect('/');
});
})(req, res, next);
});
Я нашел решение, спасибо за ваш вклад
@Oliwier - вы можете опубликовать свое решение?
@DonaldKoscheka Я разместил это как ответ на этот вопрос
Уважаемое сообщество StackOverflow, это была непростая битва, но у меня есть ответ.
Проблема заключалась в том, что я отправлял почтовый запрос, используя javascript fetch(), который является интерфейсом для выполнения запросов AJAX. И он специально разработан, чтобы не менять ваш URL. Мое решение состоит в том, чтобы отправить URL-адрес, который я хочу перенаправить, через res.json() со статусом 302 и перенаправить с помощью внешнего интерфейса. Надеюсь, это поможет кому-то, я прикрепляю код ниже.
Бэкэнд
router.post("/login", function (req, res, next) {
passport.authenticate("local", function (err, user, info) {
if (err) {
return next(err);
}
if (!user) {
return res.status(302).json({ redirectUrl: "/register" });
}
req.logIn(user, function (err) {
if (err) {
return next(err);
}
//If Successful
return res.status(302).json({ redirectUrl: "/" });
});
})(req, res, next);
});
ВНЕШНИЙ ИНТЕРФЕЙС
const login = async function (e) {
e.preventDefault();
const username = loginForm.querySelector("#email").value;
const password = loginForm.querySelector("#password").value;
const response = await fetch("/login", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
username,
password,
}),
});
const result = response.json();
const data = await result;
const { redirectUrl } = data;
window.location.href = redirectUrl;
};
Все еще не работает, у вас есть другие идеи? Такой странный баг