微服务到微服务的安全通信

Aka*_*ash 4 java spring communication jwt microservices

我想在不同的微服务之间进行通信,但出现的问题是微服务使用 jwt 令牌进行保护,并且我无法找到从第一个微服务向另一个微服务发送安全调用的方法。有没有一种方法可以直接与服务方法通信,因为如果我打开 api,它将被滥用。

或者我必须通过 api 网关来通过 api 网关发送每个请求,并从那里进行安全通信。

Mar*_*nik 6

这完全取决于您的项目的具体要求。

网关 API 通常用于向通常有 1 个端点进行通信的外部用户隐藏微服务的复杂性。

网关还可以处理安全性并对用户进行身份验证(许多公司确实这样做)。

现在,当您通过网关并且经过身份验证的请求到达客户端时,通常您已经在请求中拥有了用户身份(网关将其添加到请求中)。

所以您知道用户“John Smith”已触发该请求。

现在,如果您需要调用另一个微服务,您应该决定(这又是您的决定):

  1. 您是否需要进行身份验证(也许微服务之间的内部通信不必受到保护(

  2. 如果您确实需要微服务之间的身份验证,那么谁对请求进行身份验证?如果它是网关,则所有身份验证逻辑都在那里,但您必须为每个请求进行额外的跃点,这可能会很昂贵。或者,如果它是直接调用,则每个微服务都必须实现身份验证逻辑。当然,有像 Spring Security 这样的东西,其他语言/生态系统也有类似的解决方案,但总的来说这可能很难实现。

  3. 如果您确实从微服务 A 到微服务 B 进行了经过身份验证的调用,并且该流是由用户 John Smith 发起的,触发了对服务 A 的请求,则您应该确定该调用的语义是否为:

    • 用户“John Smith”联系服务 B,或者...
    • 服务 A 代表用户 John Smith 联系服务 B。如果您有任何类型的权限系统,这对于授权来说非常重要。
  4. 在技​​术实现方面,通常您可以使用所需的令牌将 JWT 标头添加到请求中。如果请求已通过身份验证并且您需要生成用户身份,则只需在请求上添加几个标头即可。