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

Posted

技术标签:

【中文标题】如何在 express 应用程序中正确访问 cookie【英文标题】:How to access cookies correctly in express application 【发布时间】:2022-01-06 21:48:54 【问题描述】:

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

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

这是我在快递应用上的代码...

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 访问令牌时,它可以工作,但就像我在使用我的客户端反应应用程序之前提到的那样,它没有,而是undefined。使用req.headers 我可以看到cookies。我觉得我可以访问req.headers.cookies,但是当我只运行我的后端而不运行我的客户端应用程序时我该怎么办?我不想有单独的代码。如果我需要澄清我在此所说的内容,请告诉我。

【问题讨论】:

【参考方案1】:

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

通过axios向节点服务器发送带有授权头的请求示例:


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

邮递员以这种方式发送。

【讨论】:

谢谢。是的,我知道它们不在同一台服务器上运行,但我从您的回答中没有得到的是我应该设置域。这到底是什么意思,我该如何实现这一目标? 您给出的示例也是我认为的,但这是否意味着我需要访问客户端上的令牌,这不是我想要的?还是在设置我的节点和反应服务器将运行的域之后? 我的意思是你可以设置一个域cookie。例如:如果您希望他们共享 cookie,那么您可以将服务器托管在 api.example.com 上,并将您的反应应用程序托管在 example.com 上。当您从服务器返回 cookie 时,您可以将 cookie 域设置为 .example.com,这样当 react 应用程序访问您的 api.example.com 服务器时,它将拥有会话 cookie。我在我的网站exampirate.com 上实现了这个。 是的,我给了你一个通过授权头发送令牌的例子。 好的,谢谢。抱歉,如果我问的是同样的问题,但只是确保我知道您所说的域是什么意思。我在我的快递应用程序domain: 'http://localhost:3000' 中将此添加到我的cookieOptions。不确定我是否应该这样做?

以上是关于如何在 express 应用程序中正确访问 cookie的主要内容,如果未能解决你的问题,请参考以下文章

express 引入cookie

如何从标头中正确获取 jwt 令牌并将其与 express 一起使用

如何使用两个令牌(访问/刷新)进行授权(nodejs,express)

如何正确使用 express-gateway 对 Web 应用程序进行身份验证?

如何在 Express.js 应用程序中将猫鼬模型与正确的 MongoDB 集合相关联?

如何在 DigitalOcean 中限制对 Express API 的访问