Паспорт. js аутентификация несовместима между Express маршрутами - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь использовать паспортную аутентификацию с локальной стратегией, предоставленной 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>

1 Ответ

0 голосов
/ 12 января 2020

Проверка passport-local code , похоже, что Authenticate() используется для проверки учетных данных пользователя (имя пользователя, пароль), поэтому в основном вам нужно будет использовать его только в / login route.

Чтобы проверить, авторизован ли пользователь для доступа к защищенному маршруту, вместо него можно использовать req.isAuthenticated().

Пример:

app.get("/secret", (req, res) => {
  if (!req.isAuthenticated()) {
    return res.sendStatus(401);
  }
  res.render("secret");
});
...