微服务/ SOA中的服务间通信的首选方法

时间:2017-04-13 02:06:30

标签: security authentication jwt soa microservices

在我的架构中,我有几个需要相互通信的内部服务。我还有一个身份访问管理服务,用于存储有关用户,角色和(粗粒度)权限的信息。

组件(非详尽无遗):

  • 服务A
  • 服务B
  • IAM服务

我希望它们能够作为由IAM服务管理的用户运行,而不是通过IP白名单为服务A和B提供彼此的完全访问权限。因此,服务需要一种询问彼此角色和权限的方式。我考虑过以下方法:

我为运行服务的用户创建不透明的API密钥。我将它们存储在每个服务上。当服务A调用服务B时,​​它会传递其API密钥。然后,服务B在处理请求之前调用IAM服务来验证密钥并获取有关服务A的角色的信息。服务B缓存来自IAM服务的响应以减少干扰。

我见过涉及API网关的解决方案,但这假设流量来自网络之外。我不想将内部流量重定向到外部,只是为了将不透明的令牌转换为按值的JWT。

1 个答案:

答案 0 :(得分:2)

不透明的按值代币实际上是出于以下目的:

  • 将令牌大小降至最低(为了提高客户效率)
  • 隐藏用户声称的详细信息,因为他们不需要知道
  • 强制查询每个请求的声明(以便您可以立即撤消/更改令牌)

您在内部网络上,因此有效负载大小不是一个大问题,您可能不关心泄漏对其他服务的声明。如果您的声明没有经常更改,那么可能不需要不透明的令牌。这意味着您的服务只需要请求维护一个按值令牌来访问内部资源。

这不算太糟糕。

如果您确实需要在每个请求中按ref转换为值,或者您希望为消费者简化auth循环,则代理方法最好。这将拦截对您的服务的请求,并用by-value标记替换by-ref标记(或者可能是apikey)。这里的优点是您可以更详细地控制按值令牌的使用,并且您的客户不需要关心您的内部安全基础架构。

这种方法增加了更多开销,以换取更多控制。通过内部服务调用它也很好。

我在博客上写了一些关于the authentication proxy模式的文章。