我正在研究微服务应用程序,现在正在考虑如何处理服务到服务调用之间的安全性。
为简单起见,假设我只有两项服务:
服务A有一个POST端点,比方说POST /customers
创建一个客户。
我在Api网关POST /gtw/customers
上也有POST端点。它以某种方式进行验证(调用其他服务)的方式起作用,如果一切正常,则将请求委派给服务A。
我想要实现的是服务A中的终结点只能由API网关调用(因此,将应用验证)。我正在考虑两种方法:
通过JWT令牌处理服务到服务的身份验证是一种好方法吗?
我们一起讨论
通过JWT令牌和API网关保护服务A中的端点,生成令牌,然后可以在服务A
中调用端点
有时认证不是唯一的事情。授权也可以发挥很大的作用。如果您的服务具有基于角色的功能,则必须采用这种方法。您的网关将对令牌进行身份验证,并将为您传递相同的令牌。 JWT将包含可能包含角色的声明。因此,您必须重新验证并提取声明,然后才能完全根据角色填写请求。即使在服务间通信中,服务也应将JWT令牌与请求一起传递,并且您的服务应对其进行验证。我始终喜欢这种方法,因为JWT始终可以在本地进行验证,并且可以避免Http往返,因此它不会减慢流程的速度。
保留原样,因为服务A在DMZ中运行,因此不能直接调用(因此基本上在“基础结构”级别上受保护)
此方法适用于简单的Http调用,但仅当您在私有子网或DMZ中运行后端服务时才有效。您仅应将这种方法用于简单服务,而绝不能用于保存敏感数据的服务。
据我所知,我建议您使用OAuth来保护服务到服务的身份验证。对于您的特定情况,您可以使用“客户端凭据”授予类型。它也很容易实现。使用JWT是做到这一点的一种方法,但是对于您而言,我认为带有客户端证书授予权限的OAuth 2.0将是一个完美的选择。