Почему express -сессия не сохраняется на разных маршрутах? - PullRequest
0 голосов
/ 03 марта 2020

Я пробую свои силы на 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));
  }
});
...