node.js - Express/Heroku - 在服务器 Web 应用程序而不是客户端 Web 应用程序上设置 Cookie

标签 node.js express heroku cookies cross-domain

我遇到这样的情况:部署到 Heroku 后,我的 cookie 没有设置到客户端。运行 localhost 时,cookie 会按预期设置并正常工作,但部署到 Heroku 后,cookie 会在后端 Web 应用程序而不是客户端上设置(我希望在客户端设置)。

客户端部署为下面第一个Web应用程序,服务器部署为后面的Web应用程序,因此它们是分开的 Separate client and server

当我在客户端部署( react )后登录客户端时,cookie 不是在那里设置的,而是在后端应用程序上设置的。所以cookie设置成功,但不是我的客户端。 enter image description here

为什么 cookies 会出现在这里?!我想要客户端上的 cookie enter image description here

我的express、cookie-parser、cors应用程序看起来像这样:

const express = require("express");
const cors = require("cors");
const morgan = require("morgan");
const mongoose = require("mongoose");
var cookieParser = require("cookie-parser");

const app = express();
const PORT = process.env.PORT || 4040;
require("dotenv").config();

//connect to db
mongoose.connect(
  process.env.MONGODB_URI ||
    `mongodb+srv://${process.env.MONGODB_USER}:${process.env.MONGODB_PASSWORD}@shopproject.xaroy.mongodb.net/shopitems?retryWrites=true&w=majority`,
  {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  }
);

mongoose.connection.on("connected", () => {
  console.log("Connected to Mongodb");
});

//middleware

app.set("trust proxy", 1);
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());

app.use(
  cors({
    origin: ["https://gigvilla.herokuapp.com", "http://gigvilla.com"],
    credentials: true,
    allowedHeaders: [
      "Content-Type",
      "Accept",
      "Origin",
      "X-Requested-With",
      "Authorization",
      "Set-Cookie",
    ],
  })
);

//http req logger
app.use(morgan("tiny"));

app.get("/", (req, res) => {
  res.cookie("trol", "valle").send("hello");
});

//Getting routes to app
const authRoutes = require("./routes/auth");
const shopRoutes = require("./routes/shop");
const storeRoutes = require("./routes/store");
//below test

app.use(authRoutes);
app.use(shopRoutes);
app.use(storeRoutes);
// app.use(storeRoutes);
//test

app.listen(PORT, console.log(`server is running at ${PORT}`));

使用以下代码片段发送 cookie

exports.loginUser = async (req, res, next) => {
  //Validate
  const { error } = loginValidation(req.body);
  if (error) return res.status(400).send(error.details[0].message);

  //Check for existing user
  const user = await User.findOne({ email: req.body.email.toLowerCase() });
  if (!user) return res.status(400).send("Email does not exist");

  if (user.authenticated === false) return res.status(400).send("Not verified");

  //Password is correct
  const validPass = await bcrypt.compare(req.body.password, user.password);
  if (!validPass) return res.status(400).send("Invalid password");

  //Create and assign JWT token
  const token = jwt.sign(
    { userId: user._id, userName: user.user },
    process.env.JWT_TOKEN_SECRET
  );
  res
    .status(202)
    .cookie("Authorization", "Bearer " + token, {
      httpOnly: true,
      maxAge: 3600000,
      sameSite: "none",
      secure: true,
    })
    .cookie("just testing", "my name is", {
      httpOnly: false,
      maxAge: 3600000,
      sameSite: "none",
      secure: true,
      path: "/",
    })
    .json({ userName: user.user });
};

有人知道怎么解决这个问题吗?此时变得非常绝望..(16小时内..)

最佳答案

Herokuapp.com 包含在 Mozilla 基金会的公共(public)后缀列表中,因此它将阻止您在 herokuapp.com 或 *.herokuapp.com 上设置 Cookie。您可以查看列表here .

我建议您将其托管在任何其他可以帮助您设置 cookie 的云提供商上。

此外,您还可以查看 heroku dev center为什么不允许设置cookie。它可能会帮助您了解问题不在于代码,而在于托管。

关于node.js - Express/Heroku - 在服务器 Web 应用程序而不是客户端 Web 应用程序上设置 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68346707/

相关文章:

node.js - 在 Node.js 中等待满足条件

Node : get css file with html render

express - Passport 反序列化用户方法从未被调用

javascript - 如何同时使用 Express 和 & 符号?

scala - 使用 Play 减小 Heroku 的 slug 大小! 2.0 & Scala

node.js - MongoDB - 如何更新/推送数组中的对象,该数组由另一个对象包含,而该对象又由另一个数组包含

javascript - 是否可以通过 Node JS 在几分钟内插入/更新 MySQL 中的 8,000,00 条记录

javascript - 将两个 socket.io 客户端连接在一起(建立套接字到套接字,跨浏览器连接)

ruby-on-rails - 503 服务不可用但 heroku 日志显示 200

git - 在 Heroku 应用程序中包含第二个独立存储库?