微服务架构中的 JWT 身份验证

JWT Authentication within a Micro Service architecture

问题

问题如何在 micro-service 应用程序中创建身份验证服务并让其他服务检查该令牌 (JWT) 并检索用户?

可能的解决方案

我目前的想法是基于身份验证服务在用户通过身份验证后将 { token, user } 插入 Redis。所有其他服务都可以检查 Redis 中用户的 Authorization: Bearer kdI8$dj$nD&... header 令牌。

  1. 用户发送 { username, password } 到授权服务
  2. Auth 服务验证凭据并检索 { token, user }
  3. 授权服务将 { token, user } 插入 Redis
  4. 用户使用 { token }
  5. Service-1 发出请求
  6. Service-1 在 Redis 中查找 { token } 并检索 { token, user }
  7. Service-1 做它的事情并发回 { data }

这种方法是否存在任何可能的安全、逻辑或体系结构问题?

不太清楚为什么要在 Redis 中存储令牌。安全令牌通常已经包含有关用户的信息(声明数据)。如果您需要有关未存储在令牌中的用户的信息,您应该能够通过对用户 ID 声明的简单数据库查询来查找它。

每个服务都可以通过检查其 digital signature(为此只需要签名证书的 public 密钥)、生命周期(令牌何时过期)、受众(谁是用于) 等的令牌。如果调用者提供有效令牌,则用户已通过身份验证。

使用这种方法,您将必须在所有服务中验证令牌,如果您对此没有问题,那么您可能没问题。

访问令牌可能有过期时间,因此必须使用刷新令牌从身份验证服务获取新的访问令牌:

  • 当访问令牌过期时,您将 return 从您尝试与之通信的服务 X 向客户端发送 401。
  • 客户端必须调用提供刷新令牌的身份验证服务,获取新的访问令牌
    • 最后,客户端将使用这个新的访问令牌再次访问服务 X,对其进行验证并从服务 X 获得预期的响应。

在我的 recent assignment 中,我编写了一个微服务来代理所有验证其令牌的请求,代理处理从 login/auth 到角色的所有内容,并为过期令牌发送 401 和撤销刷新令牌等. 我认为这比必须在所有服务中处理令牌给了我更大的关注点分离。然而,它当然会使代理成为系统的一个可能的瓶颈,在我的情况下,auth 服务的自动缩放是为了解决这个问题。

此外,我没有使用 redis,而是在访问令牌中存储了一个散列密钥(由散列访问令牌属性 + 盐组成),我可以通过重新散列访问令牌的其他属性+盐来验证它。

重要提示:在上面的刷新令牌场景中,我的代理只会经历 invalid/expired 访问令牌的负载,而在您的场景中,任何服务都可以通过无效访问令牌,我不知道这在您的特定情况下是否有任何问题,但可能值得一提...

另一种方法是让 Service-A 和 Service-B 调用 auth 服务来验证令牌,但这会推断出服务之间的流量更多,因为每个带有令牌的 HTTP 请求都必须经过验证.在这种情况下,无效的令牌请求也会到达您的服务 X 并因此推断它有一些负载...