Spring security 微服务之间的访问令牌/授权

Spring security 微服务之间的访问令牌/授权,spring-security,oauth-2.0,microservices,spring-cloud,spring-security-oauth2,Spring Security,Oauth 2.0,Microservices,Spring Cloud,Spring Security Oauth2,我正在创建一个在线商店RESTAPI,它主要由一个移动应用程序使用。该计划针对的是使用SpringCloud框架和SpringCloudOAuth实现安全性的微服务架构 我的问题实际上是关于微服务之间通信的最佳实践:我应该让每个服务注册它们自己的令牌,还是它们只是传递用户的令牌 例如,我有3个服务:用户服务、帐户服务、订单服务。 我已经能够实现两个创建订单的过程:一个传递用户的令牌,另一个每个服务获得自己的令牌。这两种方法我都使用佯装 因此,对于选项1:订单服务->获取帐户服务/帐户/当前 or

我正在创建一个在线商店RESTAPI,它主要由一个移动应用程序使用。该计划针对的是使用SpringCloud框架和SpringCloudOAuth实现安全性的微服务架构

我的问题实际上是关于微服务之间通信的最佳实践:我应该让每个服务注册它们自己的令牌,还是它们只是传递用户的令牌

例如,我有3个服务:用户服务、帐户服务、订单服务。 我已经能够实现两个创建订单的过程:一个传递用户的令牌,另一个每个服务获得自己的令牌。这两种方法我都使用佯装

因此,对于选项1:订单服务->获取帐户服务/帐户/当前

order服务调用account服务,该服务根据令牌中的用户ID返回帐户。然后,订单服务为该帐户创建订单

或者对于选项2:订单服务->获取帐户服务/account/user id/{userId}

order服务从发送的令牌中获取用户ID,使用自己的令牌调用帐户服务,然后使用检索到的帐户创建订单

我真的不确定哪种选择最好。一个更好的方法是分离信息,但需要两个外部客户机。但是,另一个不需要2个客户端,并且将某些端点与外部客户端隔离变得更容易,但是它需要创建额外的端点,并且几乎每个服务都需要深入身份验证对象

你的想法是什么?是否有人以这样或那样的方式完全实现了他们的系统?或许我的想法完全错了


非常感谢您的帮助。

当您进行服务器到服务器的通信时,您并不是真正代表用户,而是代表服务器本身。为此,将使用客户端凭据

使用curl作为示例: 卷曲顶点:acmesecret@localhost:9999/oauth/token-d grant\u type=客户端\u凭据


您应该对http客户端执行相同的操作,这样您将获得访问令牌。使用它调用其他服务。

您应该使用使用流的客户端令牌进行服务间通信。默认情况下,此流在spring security oauth中的/oauth/token端点上公开

除此之外,您还可以使用私有API,这些API不暴露于internet,并且通过只能提供给oauth客户端的角色进行保护。通过这种方式,您可以公开特权API,这些API的限制可能更小,验证也更少,因为您可以控制传递给它的数据


在您的示例中,您可以公开一个公共端点
GET-account-service/account/current
(获取关于您自己的信息没有坏处)和一个私有api
GET-account-service/internal/account/user-id/{userId}
可由oauth客户端专门用于查询任何现有用户。

我发现以下3个选项:

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

  • 如果我们使用client_-credentials-grant,那么我们有两个问题:一个是,我们需要在下一个microservice中发送用户名/id。另一个是,我们需要请求两次-第一次是为了获取访问令牌,第二次是为了实际调用

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