如何在 express 应用中正确访问 cookie

How to access cookies correctly in express application

我在构建 MERN 应用程序时遇到问题。当我 register/login 一个用户时,我在 cookie 中存储了一个令牌。我可以通过我的 express 应用程序正常访问此 cookie,并且在使用 Postman 时一切正常。

现在我遇到的问题是当我尝试通过 React 中的客户端访问受保护的路由时。我不确定如何正确处理这个问题,因为在我的快递应用程序中,我无法像在使用邮递员时那样获取 cookie。我正在使用 httpOnly: true,这样 cookie 只能从我的 express 应用程序访问。出于安全原因,我想保持 httpOnly 的状态,所以我不想通过我的客户端访问令牌。

这是我在 Express 应用程序上的代码...

exports.protect = catchAsync(async (req, res, next) => {
  let token;

  if (
    req.headers.authorization &&
    req.headers.authorization.startsWith('Bearer')
  ) {
    token = req.headers.authorization.split(' ')[1];
  }

  console.log(req.headers);

  if (!token) {
    return next(new AppError('No token found!', 401));
  }

  const decoded = await promisify(jwt.verify)(token, process.env.JWT_SECRET);
  const freshUser = await User.findById(decoded.id);

  if (!freshUser) {
    return res.status(401).json({
      status: 'fail',
      message: 'This token no longer exists!',
    });
  }

  req.user = freshUser;
  next();
});

当我尝试使用邮递员使用 req.headers.authorization 访问令牌时,它可以工作,但就像我在使用我的客户端 React 应用程序之前提到的那样,它没有并且是 undefined。使用 req.headers 我可以看到 cookies。我觉得我可以访问 req.headers.cookies,但是当只有 运行 我的后端而没有 运行 我的客户端应用程序时我该怎么办?我不想有单独的代码。如果我需要澄清我在这里所说的话,请告诉我。

在一定程度上理解了您的问题。 首先,你的节点服务器和你的反应服务器不会 运行 在同一个端口上。因此,服务器 cookie 将无法正常工作。您也应该设置域。如果你的反应服务器和节点服务器 运行 在那个域和它的域上,那么他们可以共享 cookie。

通过axios向带有authorization header的节点服务器发送请求示例:


    axios.post("https://<api>.com", {
      headers: {
        Authorization: 'Bearer <your-bearer-token>'
      }
    })

邮递员这样发