我正在使用 Node + Express 后端和 NextJS 前端(单独的服务器)开发一个全栈应用程序,并且在请求浏览器附加作为来自node服务器的响应标头的一部分出售的 cookie 时遇到问题。这是设置:
- node服务器运行在 localhost:3000,NextJs 服务器运行在 localhost:3001。
- 我在 etc/hosts 中设置了别名,将 someAlias.com 路由到 127.0.0.1。
使用前端用户界面(端口 3001),我能够使用 JsHttp 的 cookie 模块从后端(端口 3000)使用以下代码出售 cookie:
import { serialize } from 'cookie';
...
const cookie = serialize(TOKEN_NAME, TOKEN_VAL, {
httpOnly: true,
sameSite: 'none',
});
我能够在响应中观察到 Set-Cookie
标头。
但是,在随后的请求中,我没有看到附加的 cookie。我试过摆弄上面的 cookie 序列化参数但没有成功:
以下是我尝试过的论点:
domain: ['.someAlias.com:3000', '.someAlias.com:3001']
path: '/'
domain: '.someAlias.com'
我有一种感觉,这可能只是由于前端和后端服务器端口不同,但所有请求都在客户端发起,转到 localhost:3000(后端端口)。所以不确定我在这里可能做错了什么。
====== 更新 =======
我又进行了几次实验,发现当我直接访问 URL 时,NextJs 会在服务器端呈现页面。当我在应用程序内的页面之间转换时,页面呈现在客户端,它直接查询后端端口 3000。不幸的是,在这两种情况下,我都没有看到任何 cookie 被设置...
同一站点无
如果您使用
SameSite=none
,则还需要使用Secure
,这意味着还必须使用 SSL。然后您说您的 2 个服务器来自不相关的域,这可能不是您想要的,因为浏览器会积极丢弃 cookie。本地 PC 选项
最初在您的开发计算机上使用这些设置,并确保浏览器和 Ajax 调用中使用的所有 URL 都使用 http://somealias.com:3000 和 http://somealias.com:3001 而不是 localhost。然后 Cookie 将粘贴在开发计算机上。
已部署的选项
当您部署到适当的环境时,还要使用 SSL 并设置 cookie 选项
Secure
。最重要的是,这两个域必须满足共享同一基本域的托管先决条件,例如:这可确保发出的 cookie 被视为第一方且位于同一站点中,因此它们不会被丢弃。如果不满足先决条件,则您无法在代码中执行任何操作来解决问题。
类似资源
这个 Curity code example 使用本地开发域和相同的站点 cookie 设置,类似于我在上面使用的设置,可能有助于比较。