У меня есть страница, которую могут посещать только авторизованные пользователи, однако проверка подлинности в моем коде всегда возвращает false (перенаправляет на / clipboard, который является страницей входа в систему)
Я пытался реализовать различные модуликак и модуль session
, и я установил правильный порядок в файлах express и passport.js, я чувствую, что он должен работать, но по какой-то причине я не могу заставить аутентификацию возвращать true
const router = express.Router();
router.get("/", (_: express.Request, res: express.Response) => {
res.render("index", {
title: "Daniell | Home"
});
});
router.get("/clipboard", (req: express.Request, res: express.Response) => {
res.render("clipboard/index", {
title: "Login"
});
});
router.get("/clipboard/:username", (req: express.Request, res: express.Response) => {
if (req.isAuthenticated()) {
return res.send(`Welcome ${req.query.username}`);
}
res.redirect("/clipboard");
});
// views setup
this.express.set("view engine", "ejs");
this.express.set("views", path.join(__dirname, "../views"));
// static files
this.express.use(express.static(path.join(__dirname, "./public")));
this.express.use(express.static(path.join(__dirname, "../node_modules/bootstrap/dist")));
this.express.use("/", router);
this.express.use(bodyParser.urlencoded({ extended: true }));
this.express.use(cookieParser());
// passport
const MongoStore = connectMongo(session);
this.express.use(session({
secret: "panda warrior",
resave: true,
saveUninitialized: true,
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
this.express.use(passport.initialize());
this.express.use(passport.session());
passport.serializeUser((user: { id: string }, done) => {
done(undefined, user.id);
});
passport.deserializeUser((id: string, done) => {
User.findById(id, (error: Error, user: string) => {
done(error, user);
});
});
// mongoose
mongoose.connect(process.env.MONGO_PATH, { useNewUrlParser: true });
interface IUser extends mongoose.Document {
username: string;
password: string;
}
const UserSchema = new mongoose.Schema({
username: { type: String, required: true },
password: { type: String, required: true }
});
const User = mongoose.model<IUser>("User", UserSchema);
// authentication
passport.use(new Strategy(
(username: string, password: string, done) => {
User.findOne({ username: username }, (error, user) => {
if (error) {
return done(error);
}
if (!user) {
return done(undefined, false);
}
if (user.password != password) {
return done(undefined, false);
}
return done(undefined, user);
});
})
);
this.express.post("/clipboard",
passport.authenticate("local", { failureRedirect: "/clipboard" }),
(req: express.Request, res: express.Response) => {
res.redirect(`/clipboard/user?username=${req.user.username}`);
});
ИспользованиеПриведенный выше код переходит на localhost:3000/clipboard
и я ввожу действительные учетные данные, но я перенаправляюсь на ту же страницу, а не на страницу с сообщением об успехе