我目前正在构建一个基于微服务架构的API。
我使用JWT对用户进行身份验证。我知道当用户发送登录请求时,会返回一个包含用户身份及其角色/权限等信息的JWT。然后,该令牌与用户的后续请求一起发送,以告知服务器是谁在发送请求。我认为这是正确的理解。
在普通的单片架构中,正如所解释的那样,这可以很好地工作。我如何将其转移到微服务体系结构,以在微服务之间建立信任。
我可以简单地将用户JWT转发到下游微服务,但这不允许下游微服务知道谁/哪个上游微服务正在发送请求。
举个例子,我有一个位置微服务。我希望允许餐厅微服务对位置微服务进行呼叫。但我也有一个产品微服务,我不想将其称为位置微服务。
显然,我可以不编写产品微服务的代码来调用位置微服务,但这并不能阻止其他人这样做。
有什么建议吗?
发布于 2020-07-19 01:52:51
您至少可以通过以下两种方法确保微服务之间的通信安全:
这些机制可以有许多变体。特别是在JWT令牌情况下。例如,您可以将令牌颁发责任委托给一个服务,并且可以使用颁发者服务的公钥来验证每个服务中的令牌。
发布于 2020-06-09 23:26:08
这里你有两个不同的问题要解决!
1)用户认证/授权:
您的下游服务应该将用户JWT令牌传递给上游服务(下行依赖于上游,下游更靠近前端)。这样,所有的服务都可以验证JWT令牌,并且我们可以保证令牌是不变的。
2)微服务授权:
这是您的第二个场景,您需要保证微服务和访问资源的授权之间的信任关系。在这种情况下,在身份验证服务(密钥伪装,身份验证服务...)中,微服务是否必须是客户端(充当用户)?并且在向任何上游依赖项发送请求之前,应该对其进行身份验证,并发送他自己的JWT令牌,这样目的微服务(被调用的微服务)就可以验证并允许或不允许调用者访问资源,然后检查最终用户凭据。
这种方法可以使用客户凭证身份验证流(https://oauth.net/2/grant-types/client-credentials)来实现。
请参阅本文:https://developer.okta.com/blog/2018/04/02/client-creds-with-spring-boot
发布于 2020-01-06 19:44:06
我想这个解决方案应该是将JWT传递到网关层/聚合器/门面层。
在这一层,只需解码JWT并在DTO(任何Java类)中设置数据,这样就可以很容易地访问它们。
现在,当需要将此信息传递给任何服务时,这些信息应该作为参数传递,因为服务层的API应该是通用的。
现在,如果你想建立信任的b/w服务,你可以简单地检查参数,因为这些服务无论如何都不应该暴露在聚合器之外。
希望我说得有道理。
https://stackoverflow.com/questions/45616764
复制相似问题