我在服务器上托管了一个 nodejs express 应用程序。基本上,我有两个端点:
/session
- 这是我发回 cookie 的地方/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);
});
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 使用以进行测试。
答案 0 :(得分:1)
http://localhost:4200
和 https://uneven-glowing-scorpion.glitch.me
不是同一个域,因此不会发送 cookie。真的就是这么简单。 cookie 没有办法解决这个问题。 Cookie 不能跨域。这就是让它们安全的原因。
您的 HTTP 调用与 Postman 一起工作的原因是该应用程序在这些情况下非常宽容;浏览器不是。在 SO 上有很多关于此的问题。