mwi*_*ild 8 authentication jwt microservices
我目前正在基于微服务架构构建API。
我正在使用JWT验证用户身份。我了解到,当用户发送登录请求时,将返回包含用户身份及其角色/权限等的JWT。然后,此令牌与用户的后续请求一起发送,以告知服务器谁在发送请求。我认为这是正确的理解。
在正常的整体架构中,这可以很好地进行解释。如何将其转移到微服务体系结构以建立微服务之间的信任。
我可以简单地将用户JWT转发到下游微服务,但这不允许下游微服务知道谁/哪个上游微服务正在发送请求。
一个例子是我有一个位置微服务。我想允许餐厅微服务调用位置微服务。但是我也有一个产品微服务,我不希望能够调用位置微服务。
显然,我无法对产品微服务进行编码以调用位置微服务,但这并不能阻止其他人这样做。
有什么建议么?
您至少可以通过以下两种方法使微服务之间的通信安全:
JWt 令牌:假设微服务 A 想要与微服务 B 通信,那么 A 发出的令牌和令牌的受众是 B。在这种情况下,令牌由微服务 A 使用其私钥签名。JWT 中的 aud 字段将代表受众,它可以是单个服务或一组服务。aud 参数的值应该是服务之间预先约定的值。在微服务中,您可以使用正则表达式来验证受众。例如 aud 可以是 *.samplemicroservice.com。受众服务 B 可以通过检查 aud 字段来检查令牌是否适用于它。一旦确认,它可以使用发行人的公钥来验证它。
相互 SSL:实现它的直接方法是在服务之间使用相互 ssl。每个服务都应该启用 SSL,并且应该将其证书提供给其他服务,其他服务应该使用信任库检查证书的有效性。这应该在微服务 A 和微服务 B 上进行验证,以达成共识。自签名证书可用作所有服务证书的根 CA,并可通过信任存储进行访问。
这些机制可以有许多变体。特别是在 JWT 令牌的情况下。例如,您可以将令牌发布责任委托给一个服务,并且可以使用颁发者服务的公钥验证每个服务中的令牌。
这里有两个不同的问题需要解决!
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
我想这个解决方案应该是 JWT 应该传递到网关层/聚合器/外观层。
在这一层,只需解码 JWT 并在 DTO(任何 Java 类)中设置数据,以便轻松访问。
现在,当需要将此信息传递给任何服务时,这些信息应该作为参数传递,因为服务层的 API 应该是通用的。
现在,如果您想建立信任黑白服务,您可以简单地检查参数,因为服务无论如何都不应该暴露在聚合器之外的外部。
希望我说得有道理。
| 归档时间: |
|
| 查看次数: |
4759 次 |
| 最近记录: |