如何在 express 中解析 signedCookies?
How to parse signedCookies in express?
感谢 express,我向前端发送了一个 cookie:
// signing the token
static generateToken(user: PartialUser): Cookie {
return jwt.sign({ _id: user._id }, process.env.JWT_TOKEN_KEY, {
expiresIn: "14d",
});
// sending the cookie
return res
.status(200)
.cookie("myApp", token, {
expires: new Date(Date.now() + msPerDay * 14),
httpOnly: true,
secure: true,
})
.json({ user });
// initializing cookie parser in index.js:
app.use(cookieParser(process.env.JWT_TOKEN_KEY));
//parsing the cookie
const authenticate = (req: Authenticate, res: Response, next: NextFunction) => {
const { myApp } = req.signedCookies;
if (req.signedCookies) {
return jwt.verify(
myApp,
process.env.JWT_TOKEN_KEY,
(error, parsedToken) => {
if (error) {
return res.sendStatus(403);
}
req.cookie = { _id: parsedToken._id };
return next();
}
);
}
return res.sendStatus(401);
};
req.signedCookies
对象始终为空。所以我所有的路线 return 都是 403 - 禁止访问。但是,如果我在发送 cookie 时没有指定 secure: true
,它会起作用,因为我可以在 req.cookies
中访问它。网络选项卡显示 cookie 已随客户端请求正确发送。
如何解决这个问题?
ps:我可以使用 req.cookies
,但我的 express 服务器托管在 Heroku 上,它从不向客户端发送 cookie,这是一个自定义 https 领域。这就是我尝试 secure:true
选项的原因。目前,它仅适用于本地主机。也许解决方案在别处?
一方面是 cookie 签名,另一方面是 secure
选项,实际上是两个不同的东西。
secure
选项限制 cookie 仅通过 https 发送。这是为了避免网络窃听。默认情况下,设置为 secure
的传入 cookie 将始终由 cookie-parser
在 req.cookies
上公开。
另一方面,cookie 签名基本上是一种加密散列,旨在使 cookie 防篡改。似乎使用 cookie-parser
包,您使用 signed: true
选项签署一个 cookie。只有已明确签名的传入 cookie 才会在 req.signedCookies
上公开。请注意,这与 secure
选项无关。
感谢 express,我向前端发送了一个 cookie:
// signing the token
static generateToken(user: PartialUser): Cookie {
return jwt.sign({ _id: user._id }, process.env.JWT_TOKEN_KEY, {
expiresIn: "14d",
});
// sending the cookie
return res
.status(200)
.cookie("myApp", token, {
expires: new Date(Date.now() + msPerDay * 14),
httpOnly: true,
secure: true,
})
.json({ user });
// initializing cookie parser in index.js:
app.use(cookieParser(process.env.JWT_TOKEN_KEY));
//parsing the cookie
const authenticate = (req: Authenticate, res: Response, next: NextFunction) => {
const { myApp } = req.signedCookies;
if (req.signedCookies) {
return jwt.verify(
myApp,
process.env.JWT_TOKEN_KEY,
(error, parsedToken) => {
if (error) {
return res.sendStatus(403);
}
req.cookie = { _id: parsedToken._id };
return next();
}
);
}
return res.sendStatus(401);
};
req.signedCookies
对象始终为空。所以我所有的路线 return 都是 403 - 禁止访问。但是,如果我在发送 cookie 时没有指定 secure: true
,它会起作用,因为我可以在 req.cookies
中访问它。网络选项卡显示 cookie 已随客户端请求正确发送。
如何解决这个问题?
ps:我可以使用 req.cookies
,但我的 express 服务器托管在 Heroku 上,它从不向客户端发送 cookie,这是一个自定义 https 领域。这就是我尝试 secure:true
选项的原因。目前,它仅适用于本地主机。也许解决方案在别处?
一方面是 cookie 签名,另一方面是 secure
选项,实际上是两个不同的东西。
secure
选项限制 cookie 仅通过 https 发送。这是为了避免网络窃听。默认情况下,设置为 secure
的传入 cookie 将始终由 cookie-parser
在 req.cookies
上公开。
另一方面,cookie 签名基本上是一种加密散列,旨在使 cookie 防篡改。似乎使用 cookie-parser
包,您使用 signed: true
选项签署一个 cookie。只有已明确签名的传入 cookie 才会在 req.signedCookies
上公开。请注意,这与 secure
选项无关。