【问题标题】:Express not setting cookies快递不设置cookies
【发布时间】:2021-10-04 05:37:04
【问题描述】:

我有一个基本的身份验证设置,可以在localhost 中正常工作。当客户端向服务器发送请求时,它会将jwt token 作为cookie 分配回来。当我在生产中运行这个简单的登录时,注册设置正在工作,但 cookie 没有分配给客户端站点。
客户端:functions.js:

const { axios } = require("./axios");
const registerFunc = (name, email, password, ageName, ageDate) => {
  return userServer
    .post(
      "/register",
      {
        name: name,
        email: email,
        password: password,
        ageName: ageName,
        ageDate: ageDate,
      },
      {
        withCredentials: true,
      }
    )
    .then((res) => {
      return "success";
    })
    .catch((err) => {
      return err.response.data;
    });
};

服务器端:index.js

const express = require("express");
const cors = require("cors");
require("dotenv").config();
const cookieParser = require("cookie-parser");
const authRoutes = require("./routes/auth");
const itemRoutes = require("./routes/item");

const app = express();
app.use(
  cors({
    origin: [
      process.env.WEBSITE1_URL,
      process.env.WEBSITE2_URL,
      process.env.WEBSITE3_URL,
    ],
    credentials: true,
    exposedHeaders: ["set-cookie"],
  })
);
app.use(express.json());
app.use(cookieParser());
app.use("/api/user", authRoutes);
app.use("/api/item", itemRoutes);

app.listen(5000, () => console.log("Server running"));

服务器端:routes/auth.js:

router.post("/register", async (req, res) => {
  //Validate
  const { error } = registerValidation(req.body);
  if (error) return res.status(400).send(error.details[0].message);

  const emailExist = await User.findOne({ email: req.body.email });
  if (emailExist) return res.status(400).send("Email already exists");

  //Hash Password
  const salt = await bcrypt.genSalt(10);
  const hashedPassword = await bcrypt.hash(req.body.password, salt);

  User.create(
    {
      name: req.body.name,
      email: req.body.email,
      password: hashedPassword,
      ageName: req.body.ageName,
      ageDate: req.body.ageDate,
      loggedIn: true,
    },
    (err, data) => {
      if (err) {
        res.status(400).send(err);
      } else {
        const token = jwt.sign({ _id: data._id }, process.env.TOKEN_SECRET);
        const cookieExpiry = new Date();
        cookieExpiry.setYear(cookieExpiry.getYear() + 8000);
        res
          .cookie("authToken", token, {
            domain: "https://<client-url>.vercel.app",
            httpOnly: true,
            expires: cookieExpiry,
            secure: true,
          })
          .cookie("loggedIn", true, {
            domain: "https://<client-url>.vercel.app",
            expires: cookieExpiry,
            secure: true,
          })
          .send("Registerd");
      }
    }
  );
});

编辑:
在控制台中,它给出了这个警告: The attempt to set a cookie via a Set-Cookie was blocked because its Domain attribute was invalid with regards to the current host url

非常感谢任何帮助!
谢谢!

【问题讨论】:

    标签: node.js reactjs express cookies axios


    【解决方案1】:

    尝试将exposedHeaders: ["set-cookie"], 添加到您传递给cors 的对象中。查看类似问题的答案:Does Axios support Set-Cookie? Is it possible to authenticate through Axios HTTP request?

    【讨论】:

    • 谢谢!但不幸的是,它不起作用!我已经更新了代码。
    • res.headers['set-cookie'] 设置在 axios 帖子返回的 res 对象上吗?
    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 2011-12-25
    • 2020-02-19
    • 1970-01-01
    • 2022-10-01
    • 2012-09-27
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多