【问题标题】:Microservices to microservices communication securely微服务到微服务的安全通信
【发布时间】:2020-06-16 14:40:38
【问题描述】:

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

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

【问题讨论】:

  • 为什么不直接将令牌槽传递给您的其他 MS?然后,每个 MS 可以针对同一个令牌再次验证,您只需在初始 API 调用时提交它。
  • 我的问题是为什么首先需要跨服务通信?如果只是将数据返回给调用者,那么网关 API 将是可行的方法。在我个人看来,微服务不应该需要直接相互交谈,尽管它们可能会关心彼此触发的事件。
  • 我的要求是从角色 ms 到用户 ms 获取特定角色,但每当我使用 feign 或 rest 模板进行内部调用时,其他 ms 会抛出 401。所以我的要求是实现我的微服务,例如ms之间的所有通信都可以完成,外部通信可以使用api网关完成。

标签: java spring jwt microservices communication


【解决方案1】:

这完全取决于您的项目的确切要求。

网关 API 通常用于向外部用户隐藏微服务的复杂性,这些用户通常有 1 个端点可以与之通信。

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

现在,当您通过网关并且经过身份验证的请求到达客户端时,通常您在请求中已经有了用户身份(网关在请求中放置了什么)。

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

现在,如果您需要调用另一个微服务,您应该做出决定(再次由您决定):

  1. 那里是否需要身份验证(可能不需要保护微服务之间的内部通信(

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

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

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

【讨论】:

  • 感谢您的建议。但困扰我的是,如果我使用 api 网关对我们的 ms 进行身份验证,如何在没有身份验证的情况下进行内部通信。
  • 好吧,当微服务 A 联系微服务 B 时,它不一定会通过网关传递请求。它可以直接联系它......在这种情况下,如果服务 B 本身没有身份验证检查,它将不会使用任何身份验证
  • 它不会暴露我的 api,因为我要离开该 api 而没有身份验证。你能解释一下我应该建立什么样的基础设施来支持这一切。我正在考虑以下内容: 1:创建 Zuul api 网关,它将负责所有身份验证、日志记录、跟踪 etch 2:为应用程序相关配置配置服务器。所以如果我采用这种方法,我的微服务不会保持开放,任何人都可以直接调用我的微服务 api 离开 api 网关,如何让我的微服务只暴露给 api 网关和其他微服务。
  • 不确定我是否在关注。如果您使用“1”,则所有身份验证都在网关中完成。一旦您通过网关(来自用户的初始请求),所有后续对在 API 后面运行的微服务的请求都不需要它们之间的身份验证。当然,它们不会“暴露”给最终用户,只有网关是。您应该设置网络基础设施,以便只有网关会暴露给“外部世界”
  • 我也在考虑使用服务网格(kiali 用于所有的服务间通信),但我找不到任何相关的项目或代码。如果可能的话,你可以给我提供一个可以解决我所有问题的示例微服务项目,它是根据企业级应用程序构建的。
【解决方案2】:

你可以有两个api网关:

  • 一个暴露在外面
  • 另一个用于容器内的微服务通信。

暴露在外面的会验证令牌并将声明发送到微服务,这些声明用于验证路由保护。

在微服务通信之间,使用第二个网关发送您已经拥有的声明。希望这可以帮助。如果您找到任何替代方法,请告诉我们。

【讨论】:

    猜你喜欢
    • 2018-05-07
    • 1970-01-01
    • 2022-10-02
    • 2020-08-19
    • 2019-03-26
    • 2021-12-27
    • 2021-06-20
    • 2017-11-14
    相关资源
    最近更新 更多