【发布时间】: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 的“令牌”的讨论,请参见下面的答案。