Я пробую свои силы на express сессии. Я изучаю стек MERN и хочу реализовать базовую аутентификацию c. Моя проблема в том, что когда я устанавливаю express -session cook ie, к нему нельзя получить доступ с другого маршрута. Сервер находится на порту 5000
, а реакция работает на 3000
. Я реализовал Cors, поэтому я не думаю, что это проблема. Я попытался установить доверительный прокси, но мне тоже не повезло. Cook ie установлен на secure:false
, потому что я просто тестирую его на locahost. Я застрял на пару дней и не знаю, что делать дальше. Вот что у меня на сервере. js
//required consts
const express = require("express");
const cors = require("cors");
const mongoose = require("mongoose");
const session = require("express-session");
require("dotenv").config();
const app = express();
const port = process.env.PORT || 5000;
//middleware
app.use(cors()).use(express.json());
app.set("trust proxy", 1);
const uri = process.env.ATLAS_URI;
mongoose.connect(uri, {
useNewUrlParser: true,
useCreateIndex: true,
useUnifiedTopology: true
});
const connection = mongoose.connection;
connection.once("open", () => {
console.log("MongoDB database connection established successfully");
});
app.use(
session({
secret: "yoyo",
resave: true,
saveUninitialized: false,
cookie: { secure: false },
})
);
const exercisesRouter = require("./routes/exercises");
const usersRouter = require("./routes/users");
const Home = require("./routes/home");
const Register = require("./routes/register");
app.use("/exercises", exercisesRouter);
app.use("/users", usersRouter);
app.use("/", Home);
app.use("/register", Register);
app.listen(port, () => {
console.log(`Server listening on port: ${port}`);
});
У меня есть пара пользователей в MongoDB Atlas с учетными данными. Я проверяю действительные входы в систему на домашнем маршруте и назначаю сеанс, если вход действителен:
const router = require("express").Router();
let Account = require("../models/account.model");
router.route("/").post((req, res, next) => {
if (req.body.email && req.body.password) {
Account.authenticate(req.body.email, req.body.password, function(
err,
account
) {
if (err || !account) {
var err = new Error("Wrong email or password");
err.status = 401;
return next(err);
} else {
req.session.userID = account._id;
console.log(req.session)
}
});
} else {
var err = new Error("Email and password are required");
err.status = 401;
return next(err);
}
});
module.exports = router;
После того, как вход в систему действителен, сеанс cook ie является назначением. Вот журнал из консоли:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: false },
userID: 5e24a1ba97c14b3270145b24 }
Но когда я проверяю наличие req.session.userID
на другом маршруте, его там нет:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: false } }
Вот маршрут, который Проверка сеанса повара ie для отображения списка упражнений из базы данных:
const router = require("express").Router();
let Exercise = require("../models/exercise.model");
router.route("/").get((req, res, next) => {
console.log(req.session)
if (!req.session.userID) {
var err = new Error("You are not authorized to access this");
err.status = 403;
return next(err);
} else {
Exercise.find()
.then(exercises => {
res.json(exercises);
})
.catch(err => res.status(400).json("Error: " + err));
}
});