我正在使用Spring Boot开发微服务架构。我们在Auth服务器中实现了OAuth2。
我的问题是 - 如果两个微服务想要传达什么应该是最好的方式?
截至目前,我发现了以下选项:
如果每个微服务都在验证令牌,那么我们可以传递相同的令牌。但问题是 - 在同一令牌之间可以过期。
如果我们使用client_credentials grant那么我们就有两个问题:一个是,我们需要在下一个微服务中发送用户名。另一个是,我们需要两次请求 - 首先是获取访问令牌,然后是实际呼叫。
如果我们只在API网关中进行令牌验证(不在微服务中),那么从API网关我们需要在每个微服务中发送用户名。并且需要更改微服务实现以接受该参数/标题。
请建议我选择哪个选项,如果有更好的选择,请告诉我。
提前致谢。
答案 0 :(得分:0)
我不是OAuth的专家,但我已经对微服务做了大量的工作。使用微服务时,通常最好将服务分开:
以帐户和订单为例。您可以让Accounts服务了解用户,身份验证和授权,会话和联系信息。如果用户想要查看订单,则帐户服务可以接受所有请求,确保用户有权这样做,然后直接从订单服务请求订单。
这种方法的缺点是:
上行空间是:
另一种方法可能是让第三项服务负责身份。如果会话有效,客户端将直接向账户服务和订单服务发出请求,然后每个服务和订单服务都会询问第三个服务,并将其称为身份服务。如果没有,它将转发用户使用身份服务进行身份验证(登录)。然后,在客户端对Accounts Service或Orders服务的每个请求中,如果会话仍然有效,这些服务将使用身份服务进行检查。
这种方法的优点是:
缺点是:
第三种方法是将这些方法中的任何一种实现到单个服务中。在帐户和订单的情况下,我可能会提出一个论点,即它们密切相关,将它们拆分为单独的服务可能无法改善您的架构。
正如我所说,我当然不是OAuth的专家,但我在服务和微服务方面做了很多工作。
答案 1 :(得分:0)
也不是专家,但是
如果我们只在API网关中进行令牌验证(不在微服务中),那么从API网关我们需要在每个微服务中发送用户名。并且需要更改微服务实现以接受该param / header。
可以这样改变:
所以我的想法是 - 对于通过网关发出的每个请求,都会在请求中附加一个新的JWT。那么你没有到期问题,并且令牌很容易验证。