Passport.js + Express + Next.js + Mongoose -> локальная аутентификация не работает - PullRequest
1 голос
/ 06 ноября 2019

Я создал приложение React, используя next.js и Express для сервера. Теперь я попытался добавить локальную аутентификацию, но аутентификация каждый раз терпит неудачу. Я предполагаю, что это как-то связано с неправильной передачей параметров в Стратегию, но я не могу понять это.

Я попытался зарегистрировать ошибку, но passport.js не возвращает никакого значимого сообщения об ошибке.

Ожидаемое поведение:

Пользователи хранятся в MongoDB. Пользователь должен иметь возможность войти через форму входа в систему, а затем сеанс для этого использования должен быть сохранен в файле cookie.

Текущее поведение

После отправки POST на / login страница перенаправляется на / 404, как указано в методе аутентификации. При добавлении журнала кажется, что он вообще не может получить доступ к пользователю.

server.js

/// BUNCH OF IMPORTS ///

const initializePassport = require("./passportConfig");

const usersApi = require("./api/handlers/usersApiHandlers");

initializePassport(
  passport,
  email => usersApi.getUserBySearchparam(email),
  id => usersApi.getUserBySearchparam(id)
);

const sessionConfig = {
  secret: uid.sync(18),
  cookie: {
    maxAge: 86400 * 1000 // 24 hours in milliseconds
  },
  resave: false,
  saveUninitialized: true
};

...

app.prepare().then(() => {
  const server = express();

  server.use(session(sessionConfig));
  server.use(flash());
  server.use(passport.initialize());

  mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true });
  const db = mongoose.connection;
  db.on("error", error => console.error(error));
  db.once("open", () => console.log("connected to database"));

  server.use(cors());

  server.post(
    "/login/",
    passport.authenticate("local", {
      successRedirect: "/api/swagger-doc",
      failureRedirect: "/404",
      failureFlash: true
    })
  );

/// Bunch of routes to the different Pages ///

passportConfig.js

const LocalStrategy = require("passport-local").Strategy;
const bcrypt = require("bcrypt");

function initialize(passport, getUserByEmail, getUserById) {
  const authenticateUser = async (email, password, done) => {
    const user = getUserByEmail(email);

    if (user == null) {
      return done(null, false, { message: "No user with that email" });
    }

    try {
      if (await bcrypt.compare(password, user.password)) {
        return done(null, user);
      }
      return done(null, false, { message: "Password incorrect" });
    } catch (error) {
      return done(error);
    }
  };

  passport.use(new LocalStrategy({ usernameField: "email" }, authenticateUser));

  passport.serializeUser((user, done) => done(null, user.id));
  passport.deserializeUser((user, done) => {
    done(null, getUserById(user.id));
  });
}

module.exports = initialize;

getUserBySearchparam

const getUserBySearchparam = searchParam => {
  return fetch(baseURL + searchParam)
    .then(handleResponse)
    .catch(handleError);
};

вернул JSON для getUserBySearchparam

{
    "email": "...",
    "isActivated": true,
    "imageUrl": "...",
    "name": "...",
    "password": "...",
    "role": "...",
    "_id": "..."
}
...