我目前正在构建一个基于微服务架构的API。
我正在使用JWT对用户进行身份验证。据我所知,当用户发送登录请求时,会返回包含用户身份及其角色/权限等的JWT。然后,该令牌随后向用户发送,以告知正在发送请求的服务器。我认为这是正确的理解。
在正常的单片架构中,这解释得很好。如何将其传输到微服务架构以在微服务之间建立信任。
我可以简单地将用户JWT转发到下游微服务,但这并不允许下游微服务知道谁/哪个上游微服务正在发送请求。
一个例子是我有一个位置微服务。我想允许餐馆微服务拨打位置微服务。但我也有一个产品微服务,我不希望能够调用位置微服务。
显然,我可能不会将产品微服务编码为调用位置微服务,但这并不能阻止其他人这样做。
有什么建议吗?
答案 0 :(得分:3)
您可以通过以下两种方法使微服务之间的通信至少安全:
JWt令牌:假设微服务A要与微服务B通信,则A发行的令牌和令牌的受众是B。在这种情况下,令牌由微服务A与其签名私钥。 JWT中的aud字段将代表受众,它可以是单个服务或一组服务。 aud参数的值应该是服务之间的预先约定的值。在微服务中,您可以使用正则表达式来验证受众。例如,aud可以是* .samplemicroservice.com。观众服务B可以通过检查aud字段来检查是否有令牌。确认后,即可使用发行人的公钥进行验证。
相互SSL:实现它的直接方法是在服务之间使用相互SSL。每个服务都应启用SSL,并应向其他服务提供其证书,而其他服务应通过信任库检查证书的有效性。应该在微服务A和微服务B上对此进行验证,以达成共同协议。自签名证书可以用作所有服务证书的根CA,并且可以通过信任库进行访问。
这些机制可能有很多变体。特别是在JWT令牌的情况下。例如,您可以将令牌发行责任委派给一个服务,并可以使用发行者服务的公钥来验证每个服务中的令牌。
答案 1 :(得分:1)
这里您要解决两个不同的问题!
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