#javascript #node.js #express #passport.js
Вопрос:
Я использую PassportJS с приложением node express. Я создал 3 маршрута:
- /вход в систему
- /зарегистрироваться
- /авт.
Теперь, когда вход пользователя в систему завершен успешно.Аутентификация() верна, но когда я перехожу на другие маршруты на интерфейсе, который является приложением react. Я получаю ответ.Аутентифицированный() ложь. Я использую аутентификацию на основе сеанса passportjs. Я реализовал маршрут /auth, потому что я хочу отправить поле isLoggedIn со стороны сервера, и если это правда, то я перемещаю пользователя по частным маршрутам в react-маршрутизаторе, если isLoggedIn является ложным, то пользователь не имеет права просматривать эту веб-страницу. Я просмотрел много ресурсов в Интернете, но ни один из них не работает.
passport-config.js
const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;
const User = require("./models/user");
const bcrypt = require("bcrypt");
passport.use(
new LocalStrategy(
{
usernameField: "email",
passwordField: "password",
},
async (email, password, done) => {
try {
const user = await User.findOne({ email });
if (!user) {
return done(null, false, {
message: "Username/email not registered",
});
}
const temp = await bcrypt.compare(password, user.password);
try {
if (await bcrypt.compare(password, user.password)) {
return done(null, user);
} else {
console.log("Inside else");
return done(null, false, { message: "Password incorrect" });
}
} catch (e) {
return done(e);
}
} catch (error) {
done(error);
}
}
)
);
passport.serializeUser(function (user, done) {
// console.log("serializeUser id", user.id);
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
// console.log("deserializeUser", id);
User.findById(id, function (err, user) {
done(err, user);
});
});
user.js:
router.post("/login", passport.authenticate("local"), async (req, res) => {
console.log("Login route");
const { email, password } = req.body;
const user = await User.findOne({ email });
if (!user) {
return res.status(409).json({
message: "User doesn't exist",
});
}
bcrypt.compare(password, user.password, (err, result) => {
if (err) {
return res.status(401).json({
message: "Auth failed",
});
}
if (result) {
console.log("result login", result);
return res.status(200).json({
userId: user._id,
message: "Login successful",
});
}
return res.status(401).json({
message: "Auth failed",
});
});
});
router.post("/register", async (req, res) => {
try {
const { email, password, type, firstName, lastName } = req.body;
const doesExist = await User.findOne({ email });
if (doesExist) {
return res.status(409).json({
message: "Email exists",
});
}
bcrypt.hash(password, 10, (err, hash) => {
if (err) {
return res.status(500).json({
error: err,
});
} else {
const newUser = new User({
email: email,
password: hash,
type: type,
firstName: firstName,
lastName: lastName,
});
newUser
.save()
.then((user) => {
console.log(user);
res.status(201).json({
message: "User created",
});
})
.catch((err) => {
console.log(err);
res.status(500).json({
error: err,
});
});
}
});
} catch (error) {
console.log("error", error);
}
});
router.get("/auth", async (req, res) => {
if (req.isAuthenticated()) {
res.status(200).json({ isLoggedIn: true });
} else {
res
.status(401)
.json({ msg: "You are not authorized to view this resource" });
}
});
server.js файл: https://pastebin.com/JmxQCeGS