【问题标题】:send cookie from node从节点发送 cookie
【发布时间】:2021-12-15 12:48:38
【问题描述】:

大家早上好。 我正在尝试使用 MERN 堆栈创建身份验证系统。 现在在我的控制器中,我有这个登录功能:

 export const login = async (req, res) => {
  try {
    const { email, password } = req.body;
    const user = await Users.findOne({ email });
    if (!user)
      return res.status(400).json({ msg: "This email does not exist." });

    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch)
      return res.status(400).json({ msg: "Password is incorrect." });

    const refresh_token = createRefreshToken({ id: user._id });

    res.cookie("refreshtoken", refresh_token, {
      httpOnly: true,
      path: "/api/user/refresh_token",
      maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days
    });

    res.json({ msg: "Login success!" });
  } catch (err) {
    return res.status(500).json({ msg: err.message });
  }
};

这是获取访问令牌的函数

export const getAccessToken = (req, res) => {
  try {
    const rf_token = req.cookies.refreshtoken;
    console.log("REQ COOKIE ==> ", req.cookies.refreshtoken);
    if (!rf_token) return res.status(400).json({ msg: "Please login now!1" });

    jwt.verify(rf_token, process.env.REFRESH_TOKEN_SECRET, (err, user) => {
      if (err) return res.status(400).json({ msg: "Please login now!2" });

      const access_token = createAccessToken({ id: user.id });
      res.json({ access_token });
    });
  } catch (err) {
    return res.status(500).json({ msg: err.message });
  }
};

作为邮递员进行测试,我没有错误。 我用这个端点登录

`http://localhost: 5000/api/user/login` 

cookie 发送正确,之后我调用

http://localhost:5000/api/user/refresh_token

令牌归还给我。

通过从浏览器执行测试,它没有通过,并且 req.Cookie 始终未定义。 这是我的反应应用程序中的代码

const dispatch = useDispatch();
  const token = useSelector((state) => state.token);
  const auth = useSelector((state) => state.auth);
  const test = Cookies.get("refreshtoken");

  useEffect(() => {
    const firstLogin = localStorage.getItem("firstlogin");
    console.log(firstLogin);
    // if (firstLogin) console.log(test);

    if (firstLogin) {
      console.log("i'm here");
      const getToken = async () => {
        try {
          const res = await axios.post(
            "http://localhost:5000/api/user/refresh_token",
            null
          );
          console.log(res);
        } catch (error) {
          console.log(error);
        }
      };
      getToken();
    }
  }, [auth.isLogged]);

我哪里错了?在此先感谢大家

最后这是我的 server.js

import express from "express";
import mongoose from "mongoose";
import cors from "cors";
import dotenv from "dotenv";
import cookieParser from "cookie-parser";
import postRoutes from "./routes/posts.route.js";
import userRoutes from "./routes/users.route.js";

const app = express();
dotenv.config();

app.use(express.json({ limit: "30mb", extended: true }));
app.use(express.urlencoded({ limit: "30mb", extended: true }));

app.use(cors());
app.use(cookieParser());

app.use("/api/posts", postRoutes);
app.use("/api/user", userRoutes);

app.get("/", (req, res) => {
  res.send("Hello to memories API");
});

const PORT = process.env.PORT || 5000;

mongoose
  .connect(process.env.CONNECTION_URL, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  })
  .then(() =>
    app.listen(PORT, () => console.log(`Server Running on port ${PORT}`))
  )
  .catch((err) => console.log(err.message));

【问题讨论】:

    标签: node.js reactjs cookies


    【解决方案1】:

    有关信息,我在这里写下引导我实现目标的解决方案

    后端 index.js

    app.use(
      cors({
        origin: `${process.env.CLIENT_URL}`,
        credentials: true,
      })
    );
    

    端点登录

    res.cookie("refreshtoken", refresh_token, {
          httpOnly: true,
          sameSite: "none",
          secure: true,
          path: "/api/users/refresh_token",
          maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days
        });
    

    前端

    axios.defaults.withCredentials = true;
    export const getToken = () => API.post("/users/refresh_token", null);
    

    感谢@Danry 的帮助。

    【讨论】:

      【解决方案2】:

      我前段时间遇到过这个问题。我假设您的服务器和应用程序不在同一个来源。您需要在两端适当地设置 CORS 才能正常工作;在expressaxios 上。

      这已经回答here

      【讨论】:

      • 感谢您的回复。不幸的是,我已经尝试过了,但问题根本没有解决。我无法传递 cookie,即使传递 withCredentials: true 就像在另一个问题中一样。总是常见的错误和 cookie 未定义
      • 嗯。这很奇怪。你有没有通过快递向cors() 传递任何选项?这是我的参考:{ origin: "http://localhost:3000", allowedHeaders: [ "Origin", "Content", "Accept", "Content-Type", "Credentials", ], methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"], credentials: true, } 其中origin 是我的应用程序正在运行的位置。
      • 是的,我什么都试过了……太令人沮丧了!
      • 我刚刚记得,在创建 cookie 时尝试设置 sameSite: "none",但这意味着您还必须使用 secure 属性并且必须使用 https 连接,除非它是 localhost。希望它应该可以工作,有关更多信息,您可以参考这里:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie
      猜你喜欢
      • 2012-02-29
      • 2020-03-12
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      相关资源
      最近更新 更多