Я пытаюсь использовать паспортную аутентификацию с локальной стратегией, предоставленной passport-local-mon goose для аутентификации пользователя. Если пользователь аутентифицирован, то ему разрешено просматривать / секретный маршрут, иначе он получает сообщение о неверном запросе (предоставляется паспортом).
Странная часть заключается в том, что аутентификация работает для POST-маршрута входа в систему, который успешно перенаправляет на / секретную страницу при правильных учетных данных. Но при перенаправлении пользователь получает неверный запрос, что означает, что аутентификация не проходит по / секретному маршруту. Это очень сбивает с толку, так как пользователь может быть перенаправлен только на / secret, если он был успешно аутентифицирован при входе в систему, но при перенаправлении на / secret произойдет сбой аутентификации и будет отправлена ошибка неверного запроса.
Схема пользователя:
const mongoose = require("mongoose"),
passportLocalMongoose = require("passport-local-mongoose");
const userSchema = new mongoose.Schema({
username: String,
password: String
});
userSchema.plugin(passportLocalMongoose);
module.exports = new mongoose.model("User", userSchema);
Конфигурация сервера:
const express = require("express"),
mongoose = require("mongoose"),
passport = require("passport"),
bodyParser = require("body-parser"),
LocalStrategy = require("passport-local"),
expressSession = require("express-session");
const User = require("./models/user");
const app = express();
app.set("view engine", "ejs");
app.use(
expressSession({
secret: "Lorem Ipsum",
resave: false,
saveUninitialized: false
})
);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(passport.initialize());
app.use(passport.session());
mongoose.connect("mongodb://localhost:27017/auth-test", {
useNewUrlParser: true,
useUnifiedTopology: true
});
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
Логин и секретные маршруты:
app.post(
"/login",
passport.authenticate("local", {
successRedirect: "/secret",
failureRedirect: "/register"
})
);
app.get("/secret", passport.authenticate("local"), (req, res) => {
res.render("secret");
});
Форма входа в систему, если она необходима, используется на / GET-маршруте GET:
<form action="/login" method="POST">
<input type="text" placeholder="Username" name="username" autocomplete="off" />
<input type="password" placeholder="Password" name="password" autocomplete="off" />
<button type="submit">Submit</button>
</form>