【问题标题】:Keystone session cookie only working on localhostKeystone 会话 cookie 仅适用于 localhost
【发布时间】:2022-06-17 12:30:06
【问题描述】:

我有一个 NextJS 前端针对 Keystone 后端进行身份验证。

在本地主机上运行时,我可以登录然后刷新浏览器而不会退出,即浏览器正确读取cookie。

当应用程序部署在外部服务器上时,我仍然可以登录,但是刷新浏览器时似乎没有找到 cookie,就好像我已注销一样。但是,如果我随后转到 Keystone 管理 UI,我仍然处于登录状态。

在浏览器设置中,我可以看到为 localhost 创建了一个“keystonejs-session”cookie。外部服务器不是这种情况。

这里是 Keystone 配置文件中的会话设置。 例如,当 Keystone 部署到 admin.example.com 时,外部服务器上的 process.env.DOMAIN 的值将是 example.com。我也试过.example.com,带有一个前导点,结果相同。 (我相信新规范中忽略了前导点。)

const sessionConfig = {
  maxAge: 60 * 60 * 24 * 30,
  secret: process.env.COOKIE_SECRET,
  sameSite: 'lax',
  secure: true,
  domain: process.env.DOMAIN,
  path: "/",
};
const session = statelessSessions(sessionConfig);

(会话对象然后从@keystone-6/core 传递给配置函数。)

【问题讨论】:

    标签: cookies next.js keystonejs


    【解决方案1】:

    如果不了解您的设置,很难确定发生了什么。检查浏览器发出的请求和响应可能有助于解决这个问题。查看浏览器开发工具中的“网络”选项卡。当您发出登录请求时,您应该会看到在响应的标头中设置了 cookie。

    一些有根据的猜测:

    您是否通过 HTTPS 访问您的外部服务器?

    session API 的 Keystone 文档提到,在将 secure 设置为 true 时...

    [...] cookie 仅在使用 https: 方案发出请求时发送到服务器(localhost 除外)

    因此,如果您通过纯 HTTP 运行已部署的环境,则永远不会设置 cookie,从而创建您所描述的行为。有点令人困惑的是,在开发过程中,该标志被忽略,允许它工作。

    如果你在代理后面部署,可能会发生类似的事情,比如 nginx

    在这种情况下,很多人选择让代理终止 TLS 连接,因此请求通过 HTTP 转发到后端(但在专用网络上,因此仍然相对安全)。在这种情况下,您需要做两件事:

    我不久前做过a write up of this proxy issue。这是针对 Keystone 5 的(所以有些细节是关闭的)但是,如果您使用的是反向代理,大部分仍然是相关的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-29
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多