如何在服务器端渲染中使用跨域Cookie?

4
我有一个运行在localhost:3000的服务器端渲染Web应用程序和一个API运行在localhost:3010上。在对API的请求后,如何在两个域上设置相同的cookie?
当我登录时,我向localhost:3010发送POST请求,并设置了一个cookie,如下所示:
const token = jwt.sign({ id, email }, secret, { expiresIn });
res.cookie('authorization', token, { signed: true, httpOnly: true, maxAge: 10000000 });

我的问题是我不知道如何在localhost:3000应用程序上设置cookie。之前我只使用localStorage,但当我的API和应用程序位于不同的域时,它无法用于服务器端渲染。
这是我在localhost:3000上的服务器端渲染中间件,试图访问该cookie:
import Cookies from 'universal-cookie';

export function serverSideRendering(req, res, next) {
  const cookies = new Cookies(req.headers.cookie);
  const token = cookies.get('authorization');
  // ...
}

不确定你的技术栈,一般来说我会通过添加代理来解决这个问题,将资源分组并在同一起点渲染/提供不同路径。 例如,如果你有一个Docker Compose技术栈,你可以添加一个Nginx层,引用另外两个容器和配置文件。如果你认为值得尝试,我会尽快写出一个合适的答案 :) - sabau
1个回答

0
尝试将属性名称“authorization”更改为“JWT-token”。
res.cookie('JWT-token', token, { signed: true, httpOnly: true, maxAge: 10000000 });

或者你可以尝试使用本地的Node.js方法;

res.writeHead(200, {
  'Set-Cookie': 'authorization='+token,
});

我的建议是,不要使用cookie,而是使用头部字段。这将有助于您在未来将应用程序扩展到iOS和Android应用程序。

您可以将令牌保存在应用程序存储中,这样更加安全。


实际的cookie是从API请求返回的,我只是无法弄清如何在呈现应用程序的另一台服务器上设置它:https://media.giphy.com/media/1zKQ1LT3LtIcCU4TXw/giphy.gif - Vlady Veselinov
如果您使用原生方法添加Cookie,结果是相同的吗? - Vadim Hulevich
我建议您在开发工具中使用存储选项卡来处理Cookie,以便更好地完成工作。 - Vadim Hulevich
我明白你的意思。我尝试设置cookie的原因是希望服务器在每次浏览器发送请求时使用令牌。一旦JS包加载完成,我可以将其放入标头中,但在此之前我无法这样做,因此我想弄清楚如何从cors请求中设置cookie。我的客户端从app.com请求网站,并从api.com登录,因此cookie成功地设置为api.com,我只需要弄清楚如何为app.com设置它,也许我需要进行代理请求或其他操作。 - Vlady Veselinov
是的,在nginx中使用代理。 - Vadim Hulevich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接