如何在 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>'
}
})
邮递员这样发
我在构建 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>'
}
})
邮递员这样发