为什么 cookie 没有发送到服务器

时间:2021-01-24 14:52:30

标签: node.js angular express cookies

我在服务器上托管了一个 nodejs express 应用程序。基本上,我有两个端点:

  • POST /session - 这是我发回 cookie 的地方
  • GET /resource - 这是我检查 cookie 是否发回的地方,如果没有,我发回 401 not found,就像这样

在位于不同域的前端(假设新生成的 angular-cli 应用程序在 htpp://localhost:4200 上运行),我尝试调用 /session API,它返回cookie 标头,但连续的 /resource API 调用不会将 cookie 发送回服务器。我做错了什么?

服务代码如下:

// server.js
const express = require("express");
const app = express();
const cookieParser = require("cookie-parser");
const cors = require("cors");

app.use(cors());

app.use((req, res, next) => {
  console.log(req.method, req.url, JSON.stringify(req.headers, null, 2));
  next();
});

app.use(cookieParser());

app.get("/", (req, res) => {
  res.send({ status: "running" });
});

app.post("/session", (req, res) => {
  const cookie = `AuthSession=token; Path=/;`;
  res.setHeader("Set-Cookie", cookie);
  res.send({ status: "logged in" });
});

app.get("/resource", (req, res) => {
  const authSessionCookie = req.cookies && req.cookies["AuthSession"];
  if (!authSessionCookie) {
    res.sendStatus(401);
    return;
  }
  res.send({ resource: "resource" });
});

const listener = app.listen(process.env.PORT, () => {
  console.log("Your app is listening on port " + listener.address().port);
});

这是/session API发回的cookie: enter image description here

Angular 代码如下:

export class AppComponent {
  constructor(private readonly httpClient: HttpClient) {
    this.httpClient
      .post("https://uneven-glowing-scorpion.glitch.me/session", {})
      .subscribe(resp => {
        console.log(resp);
        this.httpClient
          .get("https://uneven-glowing-scorpion.glitch.me/resource")
          .subscribe(resp => {
            console.log(resp);
          });
      });
  }
}

如您所见,该服务器可在 https://uneven-glowing-scorpion.glitch.me 使用以进行测试。

1 个答案:

答案 0 :(得分:1)

http://localhost:4200https://uneven-glowing-scorpion.glitch.me 不是同一个域,因此不会发送 cookie。真的就是这么简单。 cookie 没有办法解决这个问题。 Cookie 不能跨域。这就是让它们安全的原因。

您的 HTTP 调用与 Postman 一起工作的原因是该应用程序在这些情况下非常宽容;浏览器不是。在 SO 上有很多关于此的问题。

相关问题