NodeJS Angular 不发送cookie到服务器自动

fdx2calv  于 2023-01-16  发布在  Node.js
关注(0)|答案(1)|浏览(124)

我在前端使用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不从浏览器发送到服务器?

ttp71kqs

ttp71kqs1#

评论中提到:
域是不同的:localhost:3000 vs. 127.0.0.1:3000。即使它们指向相同的目标,Cookie也会在两个域之间分开
我将路由从http://127.0.0.1:3000/更改为http://localhost:3000/,cookie自动发送,我的问题解决了。

相关问题