#node.js #express #passport.js
Вопрос:
Этот код описывает API REST, который обеспечивает аутентификацию сеанса и файлов cookie. Проблема в том, что файл cookie не устанавливается на стороне клиента, поэтому при посещении клиента /dashboardData
сервер отвечает 401.
На вкладке сеть инструментов разработчика присутствует перенаправление 302 вместе с файлом cookie ответа. Однако при просмотре вкладки «Хранилище/файлы cookie» инструментов разработчика файлы cookie отсутствуют.
Следующий код описывает сервер.
const express = require("express");
const passport = require("passport");
const session = require("express-session");
const cors = require("cors");
const LocalStrategy = require("passport-local").Strategy;
const MongoStore = require("connect-mongo");
const mongoose = require("mongoose");
const connection = mongoose.createConnection(
"mongodb://localhost:27017/login",
{
useNewUrlParser: true,
useUnifiedTopology: true,
},
(err) => {
if (err) console.log(err);
}
);
const UserSchema = new mongoose.Schema({
username: String,
password: String,
});
const User = connection.model("User", UserSchema);
const app = express();
app.use(cors({ credentials: true, origin: "http://localhost:3000" }));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
passport.use(
new LocalStrategy((username, password, done) => {
User.findOne({ username: username })
.then((user) => {
if (!user) {
console.log("no user found");
return done(null, false);
}
const isValidPassword = user.password === password;
if (isValidPassword) {
return done(null, user);
} else {
return done(null, false);
}
})
.catch((err) => {
return done(err);
});
})
);
passport.serializeUser((user, done) => {
console.log(user._id);
done(null, user._id);
});
passport.deserializeUser((id, done) => {
User.findById(id).then((error, user) => {
if (error) {
return done(error);
}
return done(null, user);
});
});
// const sessionStore = new MongoStore({
// mongooseConnection: connection,
// collection: "sessions",
// });
const sessionStore = MongoStore.create({
mongoUrl: "mongodb://localhost:27017/login",
});
app.use(
session({
secret: "some secret", // long random string in prod
resave: false,
saveUninitialized: false,
store: sessionStore,
cookie: {
maxAge: 1000 * 60, // 60 minutes
secure: false,
},
})
);
app.use(passport.initialize());
app.use(passport.session());
app.post(
"/login",
passport.authenticate("local", {
successRedirect: "/login-success",
failureRedirect: "/login-failure",
}),
(err, req, res, next) => {
if (err) {
next(err);
}
}
);
app.get("/login-success", (req, res) => {
res.json({ message: "all good" });
console.log("logged in with session: n", req.session, "n");
});
app.get("/login-failure", (req, res) => {
console.log("failed to log in");
res.json({ message: "nope" });
});
app.get("/dashboardData", (req, res) => {
console.log(req.session, req.isAuthenticated());
if (req.isAuthenticated()) {
res.sendStatus(200);
} else {
res.sendStatus(401);
}
});
const port = 5000;
app.listen(port);