API网关和API微服务之间的相互认证?

Posted

技术标签:

【中文标题】API网关和API微服务之间的相互认证?【英文标题】:Mutual Auth between API gateway and API microservice? 【发布时间】:2017-12-09 06:43:54 【问题描述】:

我正在编写一个 API 网关,它将向各种其他 API 公开单个入口点,这些 API 只能通过此 API 网关访问。

此 API 网关将处理来自各种前端的请求,例如网站、移动应用程序、桌面应用程序等等......

我希望能够验证对我的 API 网关的请求是否来自这些来源之一,而不仅仅是来自执行 Curl 请求的任何人。为此,我一直在寻找一种方法来授权这些请求。我已经研究过实现 JWT 来验证这些请求的来源,这个前端服务必须与 API 网关共享一个秘密,以便他们可以创建要发送的令牌,然后 API 网关可以验证这些令牌。我想问题在于这些秘密必须安全地存储在前端应用程序中。

我想知道是否有更好的方法来验证请求是否来自我期望它们来自的地方?

有人有什么想法吗?

提前致谢:)

【问题讨论】:

【参考方案1】:

正确的方法是实现一个实现 OpenId Connect 或 OAuth2 的身份提供程序(单点登录/SSO)。这些协议具有适应各种场景的不同身份验证流程,包括您所指的那个。您可以将流程client_credentials 用于可以确保client_secret 可以保密的情况,或者您可以将流程implicit 用于无法保密的浏览器、javascript 应用程序。 根据您的应用程序和前端将要工作的场景,您应该相应地配置您的客户端。然后,您的微服务将只需要以这些协议支持的一种方式验证身份提供者收到的令牌。 OpenId Connect 在实现上提供了一个“自省端点”,您可以在其中发送令牌,以便身份提供者自行验证它。

请记住,JWT 实际上不是一种协议,而是一种格式(一种标准格式,但只是一种格式)。在许多身份提供者 (IdP) 上,您可以选择发出 JWT 令牌或引用令牌。后者只是一个不包含任何数据的 GUID,但用作生成令牌时 IdP 内部存储的信息的参考。然后 IdP 可以将与该引用令牌相关的数据提供给使用该令牌的应用程序。

【讨论】:

【参考方案2】:

您可以制作自己的算法来生成唯一的时间相关访问令牌。该算法应在 API 网关和前端实现。

使用 JSON Web 令牌的好处是 JWT 是一种流行的身份验证协议。提供了适用于大多数流行编程语言的开源库,因此您不必编写自己的代码。使用标准身份验证库还可以让第三方应用更轻松地访问您的 API。

【讨论】:

以上是关于API网关和API微服务之间的相互认证?的主要内容,如果未能解决你的问题,请参考以下文章

自建API网关「架构设计篇」

API网关实践-网易云轻舟微服务

技术漫谈 | API网关那些事

微服务架构认证鉴权方案

一个简单可参考的API网关架构设计(内含代码)

用于事件驱动架构的 API 网关