【问题标题】:How come my cookies are not being set in the frontend of my app using express-session and nodejs?为什么我的 cookie 没有使用 express-session 和 nodejs 在我的应用程序的前端设置?
【发布时间】:2020-09-14 19:25:03
【问题描述】:

我正在使用 MERN 堆栈进行编程,但在使用 express-session 时遇到了障碍。当我的前端localhost:3000 命中我的后端localhost:8080 中的端点时,我似乎无法设置cookie。当我在localhost:8080 并且我在后端localhost:8080 中访问我的端点时,Cookie 设置得非常好。我该如何解决这个问题?我希望能够在注册用户时设置 httpOnly cookie 或在登录时重新生成 cookie 或在注销时销毁会话。等等...我不确定这是否是我正在处理的 cors 问题。顺便说明一下,这些 cookie 正在设置,因为我已经对其进行了测试。问题是我无法看到从我的前端设置的 cookie。

const express = require('express');
const path = require('path');
const mongoose = require('mongoose');
const session = require('express-session')
const cors = require('cors')

const MongoStore = require("connect-mongo")(session)
const PORT = process.env.PORT || 8080;
const config = require('config')

const server = express();

server.set('trust proxy', 1);
server.use(express.json());
server.use(express.urlencoded({ extended: true }))
server.use(cors({
  origin: "http://localhost:3000",
  optionsSuccessStatus: 200,
  credentials: true
}))

server.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization, Set-Cookie");
  res.header("Access-Control-Allow-Methods", "POST, GET, HEAD, DELETE, PUT, OPTIONS");
  res.header("Access-Control-Allow-Credentials", "true")
  if ('OPTIONS' == req.method) {
    res.sendStatus(200);
  }
  else {
    next();
  }
});

mongoose.connect(process.env.MONGODB_URI || config.get("mongo_db_key"),
  {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    useFindAndModify: false
  })
  .then(() => console.log("MongoDB Connected"))
  .catch((err) => console.log(err))

server.use(session({
  secret: 'keyboard cat',
  resave: false ,
  saveUninitialized: false,
  cookie: {
    secure: false,
    maxAge: 1000 * 60 * 60 * 24,
  },
  store: new MongoStore({
    mongooseConnection: mongoose.connection
  })
}))

const auth = require('./routes/API/auth');

server.use('/account', auth);

server.listen(PORT, () => console.log(`listening on port: ${PORT}`));

【问题讨论】:

    标签: javascript node.js mongodb express express-session


    【解决方案1】:

    您不能跨域(包括协议、域)设置 cookie,但您可以为子域共享的更高级别域设置 cookie(例如 Domain=mozilla.org 然后 developer.mozilla.org 将获得饼干)。当涉及到维护用户会话的 cookie 时,它​​们几乎总是由服务器而不是客户端设置(出于安全问题,应限制客户端对会话 cookie 的访问)。

    在最基本的模式中,您将只有一个后端服务器来为您的 react 应用程序提供服务,并为简单起见提供后端。

    【讨论】:

    • 没有办法让这种情况发生吗?我可以做其他选择吗?我不想将我的身份验证密钥存储在本地存储中。我希望一切都在服务器级别操作,因此用户无法修改任何内容。
    • 您不需要管理会话,因为它由 express-session 中间件管理。问题是您涉及多个域。您应该使用代理或从一个应用程序提供所有服务。
    猜你喜欢
    • 2013-05-22
    • 2021-11-18
    • 2020-12-05
    • 1970-01-01
    • 2011-10-21
    • 2023-01-23
    相关资源
    最近更新 更多