微服务方法之间的认证

mwi*_*ild 8 authentication jwt microservices

我目前正在基于微服务架构构建API。

我正在使用JWT验证用户身份。我了解到,当用户发送登录请求时,将返回包含用户身份及其角色/权限等的JWT。然后,此令牌与用户的后续请求一起发送,以告知服务器谁在发送请求。我认为这是正确的理解。

在正常的整体架构中,这可以很好地进行解释。如何将其转移到微服务体系结构以建立微服务之间的信任。

我可以简单地将用户JWT转发到下游微服务,但这不允许下游微服务知道谁/哪个上游微服务正在发送请求。

一个例子是我有一个位置微服务。我想允许餐厅微服务调用位置微服务。但是我也有一个产品微服务,我不希望能够调用位置微服务。

显然,我无法对产品微服务进行编码以调用位置微服务,但这并不能阻止其他人这样做。

有什么建议么?

Aja*_*ani 7

您至少可以通过以下两种方法使微服务之间的通信安全:

  1. JWt 令牌:假设微服务 A 想要与微服务 B 通信,那么 A 发出的令牌和令牌的受众是 B。在这种情况下,令牌由微服务 A 使用其私钥签名。JWT 中的 aud 字段将代表受众,它可以是单个服务或一组服务。aud 参数的值应该是服务之间预先约定的值。在微服务中,您可以使用正则表达式来验证受众。例如 aud 可以是 *.samplemicroservice.com。受众服务 B 可以通过检查 aud 字段来检查令牌是否适用于它。一旦确认,它可以使用发行人的公钥来验证它。

  2. 相互 SSL:实现它的直接方法是在服务之间使用相互 ssl。每个服务都应该启用 SSL,并且应该将其证书提供给其他服务,其他服务应该使用信任库检查证书的有效性。这应该在微服务 A 和微服务 B 上进行验证,以达成共识。自签名证书可用作所有服务证书的根 CA,并可通过信任存储进行访问。

这些机制可以有许多变体。特别是在 JWT 令牌的情况下。例如,您可以将令牌发布责任委托给一个服务,并且可以使用颁发者服务的公钥验证每个服务中的令牌。


Ibs*_*ado 5

这里有两个不同的问题需要解决!

1)用户认证/授权:

您的下游服务应该将用户 JWT 令牌传递给上游服务(下游取决于上游,下游更靠近前端)。这样所有服务都可以验证 JWT 令牌,并且我们可以保证令牌不变。

2)微服务授权:

这是第二个场景,您需要保证微服务之间的信任关系和访问资源的授权。在这种情况下,您拥有的所有微服务都应该是身份验证服务(密钥斗篷、Authservice...)中的客户端(充当用户),并且在向任何上游依赖项发送请求之前,应该对其进行身份验证,然后发送他的请求自己的 JWT 令牌,这样目标微服务(被调用者)可以验证并允许或不允许调用者访问资源,然后检查最终用户凭据。

这种方法可以使用客户端凭证授权流程(https://oauth.net/2/grant-types/client-credentials)来实现。

请参阅这篇文章:https://developer.okta.com/blog/2018/04/02/client-creds-with-spring-boot


Ank*_*sal 0

我想这个解决方案应该是 JWT 应该传递到网关层/聚合器/外观层。

在这一层,只需解码 JWT 并在 DTO(任何 Java 类)中设置数据,以便轻松访问。

现在,当需要将此信息传递给任何服务时,这些信息应该作为参数传递,因为服务层的 API 应该是通用的。

现在,如果您想建立信任黑白服务,您可以简单地检查参数,因为服务无论如何都不应该暴露在聚合器之外的外部。

希望我说得有道理。

  • 您需要将 JWT 转换为 DTO 吗?JWT 是一种众所周知的结构,每个微服务都可以从中提取所需的声明。您不需要支持额外的 DTO 类。 (2认同)