在我的架构中,我有几个需要相互通信的内部服务。我还有一个身份访问管理服务,用于存储有关用户,角色和(粗粒度)权限的信息。
组件(非详尽无遗):
我希望它们能够作为由IAM服务管理的用户运行,而不是通过IP白名单为服务A和B提供彼此的完全访问权限。因此,服务需要一种询问彼此角色和权限的方式。我考虑过以下方法:
我为运行服务的用户创建不透明的API密钥。我将它们存储在每个服务上。当服务A调用服务B时,它会传递其API密钥。然后,服务B在处理请求之前调用IAM服务来验证密钥并获取有关服务A的角色的信息。服务B缓存来自IAM服务的响应以减少干扰。
我见过涉及API网关的解决方案,但这假设流量来自网络之外。我不想将内部流量重定向到外部,只是为了将不透明的令牌转换为按值的JWT。
答案 0 :(得分:2)
不透明的按值代币实际上是出于以下目的:
您在内部网络上,因此有效负载大小不是一个大问题,您可能不关心泄漏对其他服务的声明。如果您的声明没有经常更改,那么可能不需要不透明的令牌。这意味着您的服务只需要请求维护一个按值令牌来访问内部资源。
这不算太糟糕。
如果您确实需要在每个请求中按ref转换为值,或者您希望为消费者简化auth循环,则代理方法最好。这将拦截对您的服务的请求,并用by-value标记替换by-ref标记(或者可能是apikey)。这里的优点是您可以更详细地控制按值令牌的使用,并且您的客户不需要关心您的内部安全基础架构。
这种方法增加了更多开销,以换取更多控制。通过内部服务调用它也很好。
我在博客上写了一些关于the authentication proxy模式的文章。