如何在解耦的前端和后端中为每个请求发送仅 http cookie(包含 jwt)?

How to send http only cookies(containing jwt) with every request in decoupled frontend and backend?

如何在解耦的前端和后端中为每个请求发送仅 http cookie?我的前端和后端是通过 heroku 部署的,前端在这里 :- https://chatapp-client-12345.herokuapp.com/

后端在这里 :- https://chatappbackend12345.herokuapp.com/

我想将我的 http only cookie(包含 jwt)发送到我的后端,以及我在后端设置的每个请求,如下所示:-

// generate jwt
    let jwtToken = jwt.sign({
        email:email,
        userId:userData._id
    },"somesupersecret");
    res.cookie("jwtToken",jwtToken,{
        expires:new Date(Date.now() + 3600000),
        httpOnly:true,
        domain:"chatapp-client-12345.herokuapp.com"
    });

但前端未设置 http only cookie

通过研究得知我只能在同一个域访问cookie,但是前后端解耦了怎么办?

我的后端基于使用 rest api 构建的节点 js,前端包含简单的 html css js 服务于节点 js

假设您的域是 https://chatappbackend12345.herokuapp.com/,您只能在两个域上设置 cookie:

(1) 确切域和子域:

chatappbackend12345.herokuapp.com

(2) 根域:

.herokuapp.com

对于你的情况,你的前端和后端的域是不同的,这意味着cookies永远无法同时被双方访问。

也不太可能(或不可行)将 cookie 设置为根域,因为您很难相信来自不属于您的网站的 cookie。

域和解耦是分开的概念。您可以拥有相同的域,而前端和后端应用程序保持解耦。

实现它的一种方法是通过反向代理(参考:nginx reverse proxy)。您可以在前端和后端之上添加一个反向代理,将它们路由到同一个域。

例如,在您自己的域下,您可以使用以下路由策略制作您的反向代理应用程序:

https://chatappbackend12345.herokuapp.com/login: 后台应用 https://chatappbackend12345.herokuapp.com/* : 前端应用

对于这种情况,您的服务器可以在客户端设置 cookie,同时两个应用程序保持解耦。

有关cookies政策的更多信息,请查看rfc6265