我遇到这样的情况:部署到 Heroku 后,我的 cookie 没有设置到客户端。运行 localhost 时,cookie 会按预期设置并正常工作,但部署到 Heroku 后,cookie 会在后端 Web 应用程序而不是客户端上设置(我希望在客户端设置)。
客户端部署为下面第一个Web应用程序,服务器部署为后面的Web应用程序,因此它们是分开的
当我在客户端部署( react )后登录客户端时,cookie 不是在那里设置的,而是在后端应用程序上设置的。所以cookie设置成功,但不是我的客户端。
为什么 cookies 会出现在这里?!我想要客户端上的 cookie
我的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/