Я не понимаю, почему req.user не определен в моих маршрутах API. У меня есть специальное промежуточное ПО для установки паспорта с именем auth, которое инициализирует паспорт и сеанс.
Я сделал одно дополнительное промежуточное ПО, чтобы посмотреть, определено ли перед вызовом API req.user, и так ли это. Но когда мне это нужно в маршруте API, оно не определено.
Server.js
...
server.use(cookieParser());
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({ extended: true }));
server.use(
session({
secret: process.env.COOKIE_SECRET,
resave: true,
saveUninitialized: false,
store: new MongoStore({ mongooseConnection: mongoose.connection })
})
);
server.use(auth.initialize);
server.use(auth.session);
server.use(auth.setUser);
//API ROUTES
server.use("/user", require("./api/routes/user"));
server.use("/youtuber", require("./api/routes/youtuber"));
...
Auth.js
const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;
const UserModel = require("../api/models/user");
passport.use(
new LocalStrategy(
{ usernameField: "email" },
async (username, password, done) => {
try {
const user = await UserModel.findOne({ email: username }).exec();
if (!user) {
return done(null, false, { message: "Invalid username or password" });
}
const passwordOK = await user.comparePassword(password);
if (!passwordOK) {
return done(null, false, { message: "Invalid username or password" });
}
return done(null, user);
} catch (err) {
return done(err);
}
}
)
);
// eslint-disable-next-line no-underscore-dangle
passport.serializeUser((user, done) => {
console.log("serializing user: ");
console.log(user);
done(null, user._id);
});
passport.deserializeUser(async (id, done) => {
try {
const user = await UserModel.findById(id).exec();
return done(null, user);
} catch (err) {
return done(err);
}
});
module.exports = {
initialize: passport.initialize(),
session: passport.session(),
setUser: (req, res, next) => {
console.log(req.user, req.isAuthenticated()); //<-- HERE IT IS DEFINED
return next();
}
};
Пользователь API / checkLogin
function isAuthenticated(req, res, next) {
if (req.isAuthenticated()) return next();
else
return res.status(401).json({
error: "User not authenticated"
});
}
...
router.get("/checklogin", isAuthenticated, (req, res, next) => {
res.status(200).json({
message: "User logged in correctly",
redirect: "/dashboard"
});
});