我在前端使用Angular 15,在后端使用node.js版本18.10.0和express版本4.17.2。
我想将浏览器cookie中的cookie发送回发送它的服务器。cookie是一个身份验证令牌,我使用标题“Set-Cookie”保存它,它保存成功,我在浏览器开发工具的应用程序cookie中看到它。
为什么cookie标头中的cookie不从浏览器发送到服务器?
我需要将令牌(如果存在)与每个请求一起发送到服务器。
我已经在我的服务器中设置了这些标头:
res.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
res.setHeader("Access-Control-Allow-Credentials", "true");
res.setHeader("Allow-Origin-With-Credentials", "true");
res.setHeader(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, X-XSRF-TOKEN, Cookie"
);
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, DELETE, PUT, OPTIONS");
我在拦截器中为每个请求设置了Angular HTTP选项(angular HTTP Option),使HTTP请求能够使用凭据,并在app.module中提供了该选项:
intercept(req: HttpRequest<any>, next: HttpHandler) {
return next.handle(
req.clone({
withCredentials: true,
})
);
}
用户登录后,我在服务器中创建并发送令牌,代码如下:
exports.userSignIn = async (req, res) => {
try {
const user = await User.findOne({ where: { email: req.body.email } });
if (user) {
bcrypt.compare(req.body.password, user.password, async (error, same) => {
if (!error) {
if (same) {
const token = jwt.sign(
{
name: user.name,
phoneNumber: user.phoneNumber,
email: user.email,
id: user.id,
},
jwtUserSecret,
{
expiresIn: "24h",
}
);
res.cookie("XSRF-TOKEN", token, { maxAge: 86400000 });
res.status(200).json({
emailExistance: true,
passwordValid: true,
expiresIn: 86400,
});
} else {
res.status(401).json({
emailExistance: true,
passwordValid: false,
expiresIn: null,
});
}
} else {
throw error;
}
});
} else {
res.status(401).json({
emailExistance: false,
passwordValid: null,
expiresIn: null,
});
}
} catch (error) {
console.error(error);
res.status(401).json({
emailExistance: null,
passwordValid: null,
expiresIn: null,
});
}
};
下面是服务器发送的上述代码的响应:
以下是保存cookie后发送到服务器请求标头的示例:
为什么cookie标头中的cookie不从浏览器发送到服务器?
1条答案
按热度按时间ttp71kqs1#
评论中提到:
域是不同的:
localhost:3000
vs.127.0.0.1:3000
。即使它们指向相同的目标,Cookie也会在两个域之间分开我将路由从
http://127.0.0.1:3000/
更改为http://localhost:3000/
,cookie自动发送,我的问题解决了。