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

Posted

技术标签:

【中文标题】kong 集成微服务的用户注册+认证【英文标题】:User registration + authentication for microservices integrated with kong 【发布时间】:2018-03-27 09:49:21 【问题描述】:

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

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

这可以通过 kong 实现吗,还是我必须以某种方式将所有这些功能转移到 kong、身份验证、授权和注册?

更新

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

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

【问题讨论】:

【参考方案1】:

所以,我想说的是,在几个地方积极使用 Kong使用 OAuth2 插件,但两者的结合(据我所知)实际上不可能使用 Kong。但是,请忍受我一会儿。

使用 JWT

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

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

在制作您的令牌时,请查看 Kong 的文档,了解 Kong 对 JWT 的期望,特别是关于 iss 声明,该声明必须与您的 API 定义中的某个属性相匹配。您可以为您的 API 手动检索它,也可以使用 Kong Admin API 来执行此操作(端口8001)。前者更简单,后者需要一些编码,但更可靠、更灵活。

使用 OAuth2 插件

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

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

解决方案的共同属性

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

第二个选项将更多内容卸载到 Kong,您在授权用户时,向不透明令牌添加 X-Authenticated-UserId 和(可选)X-Authenticated-Scope,这反过来又丰富了对后端 API 的调用通过标题。这意味着您的 API 不必做任何额外的工作来分解令牌 - 信息可以通过 Kong 注入的额外标头轻松获得。

【讨论】:

首先,感谢您回答这个问题。我一直在寻找所有的互联网。老实说,我现在更喜欢只使用 jwt 方法。医生。似乎这表明 Kong 的 jwt 插件进行了 jwt 创建,这让我感到困惑。只是为了更清楚,似乎流程必须像这样。 1)用户点击登录端点,该端点被重新路由到上游的用户服务的登录端点。 2) 成功登录后,上游 api 返回一个 jwt 令牌。 3)后续请求会传递这个token,Kong确保jwt存在? Kindaish,是的。根据您的客户类型,您的工作方式会有所不同。对于 SPA:1) 检查 localStorage 中的令牌,如果有效且存在,则使用它,2) 重定向到您的授权服务器上的 your /authorize 端点,3) 在您的 AS 中,建立身份(通过无论如何),以及 4) 制作 JWT 令牌,以及 5) 使用片段中的令牌 (.../#access_token=<JWT token>&...) 重定向回 SPA,6) 将令牌与您的 API 端点 (=Kong) 一起使用,以验证它。 "Kong 只会验证你制作的 JWT,而不是制作令牌" 希望我能在 Kong 的文档上更容易地找到这个声明。谢谢!

以上是关于kong 集成微服务的用户注册+认证的主要内容,如果未能解决你的问题,请参考以下文章

微服务Kong——认证参考

Kong 1.3发布,原生gRPC代理上游TLS交叉认证

企业级工作流解决方案--微服务消息处理模型之与Abp集成

apigateway-kong认证

Kong(v1.0.2)认证

关于微服务