Я создал приложение 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": "..."
}