我正在开发基于node.js微服务的应用程序。开发了各个微服务,包括已经处理认证,授权和注册过程的微服务。我正在审查使用kong作为api网关,但我正在寻找清楚如何通过kong处理身份验证等,但仍然使用我已创建的用户服务,已经有一个与之关联的数据库。
理想情况下,我希望能够将身份验证信息传递给用户服务以验证用户的登录凭据(用户名和密码),并且如果身份验证成功,则kong生成jwt令牌。
这可能与kong有关,还是我必须以某种方式将所有这些功能转移到kong,身份验证,授权和注册?
我发现以下文章概述了使用自定义身份验证服务器的方法,但这似乎非常复杂:Custom Authentication Service in Kong API Gateway。
简而言之,我希望用户将用户名/密码组合传递给kong,kong会以某种方式将上游传递给我已经拥有的用户服务的端点。然后,这将验证用户并确认或拒绝用户/传递是正确的。从这一点来说,kong会生成jwt并返回给用户。如果这是可能的话会很棒。如果我有一个可以工作的自定义授权服务,但绝对不是首选。: - )
答案 0 :(得分:3)
那么,我想在几个地方积极使用Kong,我会建议你要么使用JWT,要么使用Kong,或的JWT插件使用OAuth2插件,但两者的组合(据我所知)实际上不可能与Kong。但是,请耐心等待一段时间。
对于您的情况,使用JWT可能是一个相当简单的解决方案。我在你的假设中看到的唯一误解是,Kong实际上可以帮助你制作JWT令牌,而并非如此。 Kong只能验证JWT,但不能制作它们;这必须由您自己的授权服务完成。再说一次,你想如何将令牌传递给消费服务再次取决于服务的类型。
在这里,您可能希望使用OAuth2流程,例如如果您的客户是SPA或其他一些授权(例如资源所有者密码授予),则隐式授权,但在这两种情况下,Kong 都不会帮助您实施它。您需要自己实现/authorize
(对于隐式授权)或/token
端点(对于资源所有者密码授予)。再一次:Kong将只验证你工艺的JWT,而不是制作令牌。实现这些终点并不是很困难,但需要阅读RFC 6749(值得付出努力)。
在制作令牌时,请查看Kong对JWT期望的文档,特别是有关iss
声明的内容,该声明必须与API定义中的某个属性相匹配。您可以手动为API检索,也可以使用Kong Admin API执行此操作(端口8001
)。前者更容易,后者需要一些编码,但更可靠和灵活。
您在其他问题中找到的solution outline提供了一个不同的解决方案,您可以在其中实际实施真正的OAuth2授权服务器,并使用Kong OAuth2插件。
这确实需要深入研究OAuth2规范,并且很好地理解Kong如何做到这一点(这有点特别)。我在该问题中提供的答案概述了必要的步骤。
使用这两种解决方案,您可以获得Kong验证您的API调用的好处,并且只允许使用有效令牌的呼叫通过。 JWT选项让您制作令牌,并且还需要您的API后端实现来检查令牌并获取它需要的声明,例如"用户ID"或"范围"来自JWT令牌。 Kong不会为你做这项工作,只会验证JWT令牌是否正确签名。
第二个选项将更多内容卸载到Kong,在授权用户时,您可以向不透明令牌添加X-Authenticated-UserId
和(可选)X-Authenticated-Scope
,而不透明令牌也会在通过标题到你的后端API。这意味着您的API不需要在将令牌分开时进行任何额外的工作 - 这些信息可通过Kong注入的额外标题轻松获得。
希望这有助于澄清香港能做什么和不能做什么(至少目前)。