跨多个微服务使用 JWT 身份验证

Using JWT authentication across multiple microservices

我在网上搜索了有关此问题的答案,但没有任何内容与我的设置非常相似。

所以我有一个单页应用程序和 3 个服务:

  1. 后端服务-服务A
  2. 为 SPA 的静态文件提供服务的服务 - 服务 B
  3. 身份验证服务 - 服务 C

流程如下:

https://auth0.com/docs/security/store-tokens - 这个 link 是我发现的一个来源的例子,它正在讨论在何处存储 SPA 令牌的问题。 它在那里说如果 :

我应该使用 cookie 来存储 JWT

问题是我的后端有一个不同的 URL,它是一个完全不同的服务,所以使用 cookies 不是解决方案,或者至少在我看来是这样。

然后它说:

If your single-page app has a backend server at all, then tokens should be handled server-side using the Authorization Code Flow, Authorization Code Flow with Proof Key for Code Exchange (PKCE), or Hybrid Flow.

这里的问题是他们甚至没有提到如何以及在何处存储 JWT 以便我可以从多个域访问它。

我还没有找到一种干净的方法来将该 JWT 保存在用户的浏览器上并在我对后端执行的每个请求中发送它。

我需要的解决方案是以安全的方式将 JWT 保存在用户的浏览器中,允许我将其发送到我需要的任何后端服务。

感谢到目前为止的阅读和帮助!

一种解决方案是在查询参数中使用 JWT 将请求发送到后端服务。

然后您可以在后端服务中使用中间件将其转换为 Authorization header,以便查看它的库继续工作。

这就是我选择的实施解决方案的方式,但首先需要澄清一下。

如问题中所述,当浏览器尝试访问该站点时,将被重定向到 /login 路由以验证用户。 但是如果用户不存在,那么我会让用户以最低权限查看该站点。 因此,如果用户通过身份验证,则 cookie 将包含具有所需数据的 jwt。 如果用户是某种客人,服务 B 仍将 return cookie,但会表明用户是客人。

我选择的实现方式是:

  • 由于上面的解释,我们总是从服务 B 获取 cookie,这意味着我们总是可以告诉我们的站点将其保存在浏览器的 LocalStorage 中,所以我决定将 JWT 保存在其中。
  • 对于我向服务 A 发出的每个获取请求,我将设置一个名为 Authorization 的 header,它的值将为 Bearer <the jwt token>(将 jwt 插入 <the jwt token>) 如这篇关于授权的 MDN 文章所述。

关于安全:

因此,由于无法将 JWT 保存在与服务 A 相关的 cookie 中(服务 B 和 A 来自不同的域),我们只剩下 LocalStorage 选项。 LocalStorage 不是最安全的方式,它默认容易受到 XSS 攻击, 但是,正如 mikejones1477 在 this 的回答中所述,现代浏览器对 XSS 具有强大的防御能力,并且 LocalStorage 不容易受到 CSRF 的攻击。 因此,从本质上讲,应该格外小心 XSS 攻击,但这是可以在不同域的服务之间传递令牌的方式。