passport.authenticate() 没有重定向
passport.authenticate() isn't redirecting
我的护照中间件有问题,当我对用户进行身份验证时它没有重定向我不知道出了什么问题。
这是 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.log(user));
res.status(201).json({ message: "All good" });
});
module.exports = router;
你可以尝试使用重定向的回调函数你可以根据Docs
这样做
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);
});
亲爱的 Whosebug 社区,这是一场具有挑战性的战斗,但我从中得到了答案。
问题是我使用 javascript fetch() 发送 post 请求,它是一个用于发出 AJAX 请求的接口。它专门设计用于不改变您的 URL。我的解决方案是发送我想通过 res.json() 重定向的 URL 状态 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;
};
我的护照中间件有问题,当我对用户进行身份验证时它没有重定向我不知道出了什么问题。
这是 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.log(user));
res.status(201).json({ message: "All good" });
});
module.exports = router;
你可以尝试使用重定向的回调函数你可以根据Docs
这样做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);
});
亲爱的 Whosebug 社区,这是一场具有挑战性的战斗,但我从中得到了答案。
问题是我使用 javascript fetch() 发送 post 请求,它是一个用于发出 AJAX 请求的接口。它专门设计用于不改变您的 URL。我的解决方案是发送我想通过 res.json() 重定向的 URL 状态 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;
};