【问题标题】:Server to Server communication in microservices微服务中的服务器到服务器通信
【发布时间】:2018-02-20 13:10:21
【问题描述】:

我正在研究微服务架构,但我在这方面面临一些挑战。

首先让我简要介绍一下架构。

  1. 用户登录并获得一个签名令牌,该令牌将用于调用所有 REST API。

  2. 会有很多 API 服务器使用 Spring 安全性保护 API 并根据用户角色进行授权。

  3. 服务必须相互交互才能获取/更新信息。

  4. 每个服务都有权验证身份验证服务器发出的令牌。

问题:-

  1. 如果用户登录并且使用相同的令牌并将其传递给经过验证的每个服务,则一切正常。因此,在传递令牌时服务不需要相互信任。

    李>
  2. 现在,问题是有些服务需要在不登录的情况下从服务器本身调用。假设是服务器到服务器调用。服务将如何验证和授权来自其他服务的调用。

我读到了 spring 微服务,但 Zuul 也不是这里的救星,因为每个 API 服务器都嵌入了 spring 安全性,而不仅仅是 API 网关。

一种解决方案可以是每个服务都有自己的具有特定角色的默认用户,用于登录->获取令牌->使用令牌调用其他服务器 api。

您能否在服务器中给我一些指向服务器调用的指针,其中每个服务器都使用 Spring Security 进行身份验证和授权。

谢谢。

【问题讨论】:

  • 不要保护这些服务,或者允许从某个 IP 地址访问所有人。只需编写正确的安全规则即可。
  • @M.Deinum... 这些服务需要受到保护,因为它们将被外部客户端以及手机/REST 调用。
  • 正如我提到的,只需编写适当的安全规则,如果内部(或特定 IP 范围)允许访问,则需要令牌。所以这一切都归结为适当的安全规则,而不是试图解决它。
  • 我建议根本不允许微服务使用同步通信(在微服务之间,UI/客户端可以使用 api)(使用消息传递和 pub/sub 代替)。
  • @mav3n 你能在内部信任你的服务吗?如果是,则无需添加任何安全过滤器,否则您需要将生成的某种令牌传递给下游服务,该服务将再次进行身份验证并形成身份验证主体。

标签: java spring microservices spring-cloud-netflix


【解决方案1】:

在 OAuth2 中,有一个专用于服务器到服务器授权的流程(客户端凭据授予流程)。调用服务是第二个(资源服务器)的常规客户端,因此它必须获取令牌并使用它。

简而言之,客户端告诉授权服务器他是谁(使用它的客户端id/应用程序id),授权服务器给它一个令牌,可以用来查询资源服务器。

我有一个法语资源here,序列图是英文的,应该会有所帮助。您可以轻松找到有关此流程的更多信息。

有关 Spring Security 的特定内容,请参阅spring-security-oauth2 doc

【讨论】:

  • 现在我没有使用 OAuth。但我认为我可以绕过 IP 地址安全性的上述 cmets 可能是一件好事。
【解决方案2】:

理想情况下,在微服务架构中,我们不应调用服务中的其他服务。我们应该使用 Publisher/Subscriber 方法进行服务器到服务器的通信。

即使您希望这样做,只需将 Auth-Token 作为用于验证服务的 Header 传递给下游服务,令牌将再次被验证并因此会给出响应一旦通过身份验证。

【讨论】:

    猜你喜欢
    • 2016-04-19
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 2016-05-20
    • 1970-01-01
    • 2019-12-24
    • 2013-07-01
    相关资源
    最近更新 更多