我正在寻找一种最佳实践和有效的解决方案,以保护多个微服务通过REST与Web客户端应用程序进行通信。
当前设置:
这些微服务是用Java构建的,使用Spring Framework并运行到Docker容器中。
客户端是Angular 2应用程序。
我制作了一个新的μService,它将充当“网关”,并且是我的网络客户端和我的其他服务之间的唯一通信点。
我从远程身份验证API检索JWT加密令牌(让我们称之为LOCK)
解决方案我在考虑:
我可以将登录JWT存储到cookie中,然后将其发送到网关。
网关嵌入最终有效负载,发送给相关的μService令牌,如果用户是新用户,则存储用户。
然后微服务获取查询,在远程认证服务中检查用户角色,如果足够,则返回200状态结果。
修改
我们需要在我们的μServices配置单元中安装RabbitMQ Broker,从而使用WebSockets。为了以与保护REST API相同的方式保护WebSockets,我不确定我们是否仍应该在网关中管理安全性,并且可能自己在微服务级别管理它。因为很多消息都会传输,我们应该摆脱一个会减慢这个东西的中间件。
问题:
这是一个好习惯吗?什么可以做得更好?你有没有做过满足同样需求的事情的例子?非常感谢您的分享和想法。
答案 0 :(得分:2)
我建议你看看Dave Sayer关于这个主题的精彩网络研讨会。他建议了几种可能的选择,从Spring会话到OAuth2不等。
您可以在此处找到网络研讨会:https://spring.io/blog/2014/11/07/webinar-replay-security-for-microservices-with-spring-and-oauth2
还有一个包含代码示例的教程,但我现在找不到它。
答案 1 :(得分:1)
我会通过以下方式做到这一点:
考虑到每个微服务都在 apigateway 后面,即使是身份验证/授权微服务 -> 我们简单地称之为 auth
。
一旦请求到来,apigateway 就会检查 auth 服务,auth 服务会做它需要做的事情来验证令牌和请求者是否合法,并用 200/401(/403) 响应 apigateway。< /p>
如果 apigw 得到 200,它会将请求转发到该端点上的任何微服务,否则返回其他状态。
如果我们考虑这种情况,并且它是通过 apigateway 进入您环境的唯一入口点,我认为您没有任何理由确保其他服务之间的通信安全。
让我们考虑一下这个场景:
client -> calls POST /api/v1/cars
https://..../api/v1/cars
CarsMicroservice
subject
字段,即用户的 uuid,我们需要一个用户名 -> 汽车关联,因此当请求到达 carsMicroservice 时,它将 DECODE
有效负载,获取用户 uid,要求 userMicroservice 返回有关具有该 uid 的用户的所有信息。这种通信不需要安全,因为它是在所有必要的安全检查之后在内部完成的。当然,您可以强制执行此操作,即用户可以访问的唯一用户信息是他自己的等,但这些都是自定义启发式的。
答案 2 :(得分:0)
此外,您可能必须在微服务之间建立信任。您可以使用以下组合: