【问题标题】:Inter-service communication with Spring Boot and OAuth2使用 Spring Boot 和 OAuth2 进行服务间通信
【发布时间】:2018-05-17 17:31:05
【问题描述】:

我正在使用 Spring Boot 开发微服务架构。我们已经在 Auth Server 中实现了 OAuth2。

我的问题是 - 如果两个微服务想要进行通信,最好的方式应该是什么?

到目前为止,我发现了以下选项:

  1. 如果每个微服务都在验证令牌,那么我们可以传递相同的令牌。但问题是——在同一令牌之间可能会过期。

  2. 如果我们使用 client_credentials 授权,那么我们有两个问题:一个是,我们需要在下一个微服务中发送用户名。另一个是,我们需要请求两次——第一次是获取访问令牌,然后是实际调用。

  3. 如果我们只在 API 网关(不在微服务中)进行令牌验证,那么我们需要从 API 网关在每个微服务中发送用户名。并且需要更改微服务实现以接受该参数/标头。

请建议我应该选择哪个选项,如果有更好的选择,请告诉我。

提前致谢。

【问题讨论】:

    标签: spring oauth-2.0 microservices


    【解决方案1】:

    我不是 OAuth 方面的专家,但我在微服务方面做了很多工作。在使用微服务时,最好以如下方式分离服务:

    AccountsOrders 为例。您可以让 Accounts 服务了解用户、身份验证和授权、会话和联系信息。如果用户想要查看订单,accounts 服务可以接受所有请求,确保用户被授权这样做,然后直接从 Orders Service 请求订单。

    这种方法的缺点是:

    • Accounts Service 必须将所有订单数据传递给用户客户端,这可能会导致代码重复和复杂性
    • 更改订单服务 API 可能需要更改帐户服务以传递新数据

    优点是:

    • Accounts Service 可以使用 API 令牌等服务级身份验证机制直接向 Orders Service 进行身份验证
    • Orders Service 可能存在于专用网络上

    另一种方法可能是让第三方服务负责标识。如果会话有效,客户端将直接向 Accounts Service 和 Orders Service 发出请求,然后它们会分别请求第三个服务,我们称之为身份服务。如果不是,它将转发用户以使用身份服务进行身份验证(登录)。然后,在客户端向 Accounts Service 或 Orders 服务发出的每个请求中,这些服务将与身份服务检查会话是否仍然有效。

    这种方法的优点是:

    • 账户和订单服务不需要知道用户名和密码
    • 每个服务只是将其负责的数据直接提供给客户端

    缺点是:

    • 这种架构设置起来有点困难

    第三种方法是将这些方法中的任何一种实现到单个服务中。对于帐户和订单,我可能会提出一个论点,即它们之间的关系非常密切,将它们拆分为单独的服务可能不会改善您的架构。

    正如我所说,我当然不是 OAuth 方面的专家,但我在服务和微服务方面工作过不少。

    【讨论】:

    • 如果我没有错,那么对于我的情况,API 网关位于公共 IP 中。比如说,我有两个微服务——账户和订单。客户端使用验证令牌和授权的令牌在 API 网关中请求订单。之后通过请求订购服务。反过来,订单服务调用帐户服务。问题是 - 我不能使用令牌中的用户名/ID(因为我们没有从 API 网关传递)来订购服务/帐户服务,这肯定是请求验证所需要的。
    • 不是更好的方法是使用 API 网关并将令牌验证逻辑保留在其中吗?
    【解决方案2】:

    也不是专家,但是

    如果我们只在 API 网关(不在微服务中)进行令牌验证,那么我们需要从 API 网关在每个微服务中发送用户名。并且需要更改微服务实现以接受该参数/标头。

    可以这样改变:

    • 您使身份验证/授权成为网关的问题。
    • 当网关授权客户端时,它会将 JWT 令牌附加到它将代表客户端发出的每个微服务请求(而不是发送用户名)。 JWT 将包含微服务可能需要的所有信息。如果微服务需要调用其他微服务,则需要在请求中进一步传递该令牌。

    所以想法是 - 对于通过网关的每个请求,都会将新的 JWT 附加到请求中。那么你就没有过期问题,并且令牌很容易验证。

    【讨论】:

    • 感谢这个新想法。但如您所知,只有授权服务器才能生成新的 JWT。因此,如果网关想要附加一个新的 JWT,那么它每次都必须再次向授权服务器请求。这不是时间效率。
    • 我想问一个不同的问题。我有一个 OAuth2 服务器在端口 8899 上运行。我还有一个用户服务(资源)应用程序在端口 9090 上运行。在 9090 中,我在请求中定义了一个 getUser () 方法。我只希望 Oauth2 (8899) 服务器也可以访问 getUser () 方法。我正在使用智威汤逊。我该怎么做?
    猜你喜欢
    • 2018-11-03
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2021-12-03
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多