与kong集成的微服务的用户注册+认证

User registration + authentication for microservices integrated with kong

我正在开发一个 node.js 基于微服务的应用程序。开发了单独的微服务,包括已经处理身份验证、授权和注册过程的微服务。我正在审查使用 kong 作为 api 网关,但我正在寻找关于如何通过 kong 处理身份验证等的清晰度,但仍然使用我已经创建的用户服务,它已经有一个与之关联的数据库。

理想情况下,如果我可以让 kong 将身份验证信息传递给用户服务以验证用户的登录凭据(用户名和密码)并在身份验证成功时让 kong 生成 jwt 令牌,我会更愿意。

这对 kong 是否可行,或者我是否必须以某种方式将所有这些功能转移到 kong、身份验证、授权和注册?

更新

我发现以下文章概述了使用自定义身份验证服务器的方法,但这似乎很复杂:Custom Authentication Service in Kong API Gateway

简而言之,我希望用户将 username/password 组合传递给 kong,该 kong 会以某种方式向上游传递到我已有的用户服务端点。然后这将验证用户并确认或拒绝 user/pass 是正确的。从这一点开始,kong 将向用户生成 jwt 和 return。如果这是可能的,那就太好了。如果我有一个自定义授权服务也可以工作,但绝对不是首选。:-)

所以,我想说的是,在几个地方积极使用 Kong,我建议你或者 使用 JWT,以及 Kong 的 JWT 插件,or 使用 OAuth2 插件,但两者的组合(据我所知)实际上不可能与 Kong 一起使用。但是,请耐心等待我一会儿。

使用 JWT

对于您的情况,使用 JWT 可能是一个相当简单的解决方案。我现在在您的假设中看到的唯一误解是 Kong 实际上可以帮助您制作 JWT 令牌,并非如此。 Kong 只能验证 JWT,而不能制作它们;这必须由您自己的授权服务来完成。话又说回来,你想如何将令牌传递给消费服务又取决于服务的类型。

在这里,您可能想要使用 OAuth2 流程,例如如果您的客户是 SPA,则为隐式授权,或其他授权(例如资源所有者密码授权),但在这两种情况下,Kong 不会 帮助您实现它。您需要自己实现 /authorize(对于隐式授权)或 /token 端点(对于资源所有者密码授权)。再说一遍:Kong 只会验证 you 制作的 JWT,而不制作令牌。实现这些端点并不困难,但需要阅读 RFC 6749(值得付出努力)。

制作您的令牌时,请检查 Kong 的文档以了解 Kong 对 JWT 的期望,尤其是关于 iss 声明,它必须与您的 [=51= 中的某个 属性 相匹配] 定义。您可以为您的 API 手动检索,或者您可以使用 Kong Admin API 来执行此操作(端口 8001)。前者更容易,后者需要一些编码但更可靠和灵活。

使用 OAuth2 插件

您在另一个问题中发现的 solution outline 提出了一个不同的解决方案,您实际上实现了一个真正的 OAuth2 授权服务器,并利用了 Kong OAuth2 插件。

这确实需要深入研究 OAuth2 规范,并且还要很好地理解 Kong 是如何做到这一点的(这有点特别)。我在该问题中提供的答案概述了必要的步骤。

解决方案的共同属性

对于这两种解决方案,您都可以获得 Kong 验证您对 API 的调用的好处,并且只允许具有有效令牌的调用通过。 JWT 选项让您制作令牌,并且还需要您的 API 后端实现来检查令牌并取出它需要的声明,例如来自 JWT 的“用户 ID”或“范围”令牌。 Kong 不会为您完成这项工作,它只会验证 JWT 令牌是否已正确签名。

第二个选项将更多的负载卸载给 Kong,在 Kong 中,当您授权用户时,向不透明令牌添加一个 X-Authenticated-UserId 和(可选)一个 X-Authenticated-Scope,这反过来被丰富到通过 headers 调用您的后端 API。这意味着您的 API 不需要做任何额外的工作来拆开令牌 - 信息可以通过 Kong-injected extra headers.

轻松获得