【问题标题】:Express to express - How can httpOnly cookie can be forwarded?Express to express - httpOnly cookie如何转发?
【发布时间】:2021-08-14 03:14:36
【问题描述】:

当前端 (A) 为 /login 访问后端时,后端 ExpressJs (B) 通过执行以下操作以 httpOnly cookie 响应:

ctx.res.cookie('auth-token', jwt.sign({ userId: userId }, APP_SECRET, { expiresIn: 100000 }), {
   httpOnly: true,
   maxAge:  100000,
})

前端 (A) 保存此 cookie(作为 httpOnly)并将此 cookie 转发到后端 (B) 以供下次调用(例如 /getMe)。后端 (B) 可以通过 cookie.parse(ctx.req.headers.cookie) 访问此 cookie 效果很好。

现在另一个后端 (expressJs) (C) 需要使用 axios 请求登录到后端 (B)。 (C) 将通过/login 命中 (B)。 httpCookie 在此调用的标头中。它运作良好。但是 (C) 无法将 cookie 保存为 httpOnly,然后无法转发到 (B) 此 cookie 以供下次调用。

(C) 如何将 httpOnly cookie 转发给 (B) 以进行像 /getMe 这样的经过身份验证的调用?

【问题讨论】:

  • 您的前两段描述了 A 和 B 都可以访问 cookie 的情况。然后,您的最后一段询问了一个关于 C(服务器)将 cookie 发送给 B 的问题。这没有任何意义。 C没有cookie。 A 无法向 C 发送 cookie,因为它是 httpOnly,因此客户端 A 无法直接访问 cookie。 B 拥有 cookie(或可以存储它),但将其发送给 C 是没有意义的,因为这似乎会破坏任何身份验证安全性。我认为您可能需要备份几个步骤并描述整体问题,因为您可能需要不同的方法。
  • C(expressJs)的行为应该和A(ReactJs)一样。 C必须先登录。正如您所说,(A)可以将cookie发送回(B),因为它是客户端/浏览器。 C 不是客户端.. 所以我同意 C 如何进行身份验证并转发 cookie? (C) 是需要使用 (B) API 并且必须经过身份验证的第 3 方。希望有帮助
  • 好吧,除非 A 向 C 提供其身份验证凭据,否则 C 无法以 A 身份登录,我怀疑您是否愿意这样做。有关 A 可以从 B 请求并提供给 C 和 C 可以用来访问 B 的“令牌”的讨论,请参见下面的答案。

标签: express jwt httponly


【解决方案1】:

有时在网络上用于第三方访问的一种技术是客户端 A 向服务器 B 请求它可以传递给第三方的“令牌”。该令牌允许第三方代表 A 访问服务器 B(或服务器 B 的一部分)。该令牌可以设置为过期或只能具有某些特权。令牌需要足够独特且足够长以至于难以猜测,并且当服务器 B 授予该令牌时,它必须存储它。

例如,Github 允许我创建一个仅允许访问我的 gist 的令牌,然后我可以将其提供给第三方应用程序,这样它就可以只读取/写入我的 Github gist 而无需向第三方提供我的凭据或任何对我的整个 Github 帐户的通用访问。此外,我可以随时通过 Github(在本例中为您的服务器 B)撤销该令牌。

因此,您可以让客户端 A 从服务器 B 请求访问令牌以执行某些操作子集。服务器 B 会看到客户端 A 已经作为客户端 A 正确地进行了身份验证,因此它将生成一个令牌并在响应负载中返回它(而不是作为 cookie)。然后,客户端 A 可以获取该令牌并将其提供给服务器 C,以允许服务器 C 使用它代表它访问服务器 B。

显然,您必须完全信任服务器 C,它不会滥用您通过令牌授予的任何特权,并且它将安全地存储和保护令牌,并且仅将其用于客户端 A 请求的服务做(不要让任何其他客户使用它)。服务器 B 也应该需要 https 才能访问任何令牌。

【讨论】:

  • @alan - 你可以使用这种技术吗?如果不是,请解释。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2021-06-21
  • 2021-03-05
  • 2020-08-14
  • 2019-12-09
  • 2021-11-03
  • 2020-11-19
  • 1970-01-01
相关资源
最近更新 更多