Kong API 网关中的自定义身份验证服务
Posted
技术标签:
【中文标题】Kong API 网关中的自定义身份验证服务【英文标题】:Custom Authentication Service in Kong API Gateway 【发布时间】:2018-01-19 01:20:06 【问题描述】:我们目前正在为我们的微服务分析 API 网关,而 Kong 是可能的候选者之一。我们发现 Kong 支持多个身份验证插件,但所有插件都基于存储在 Kong 数据库本身中的用户。我们需要将此责任委托给我们的自定义身份验证 HTTP 服务,并且不想将这些用户添加到 API 网关数据库中。
【问题讨论】:
【参考方案1】:可以通过一些代码来完成此操作,而不是使用 OpenID 连接插件;实际上,您需要实现一个授权服务器,它通过 Admin (8001) 端口与 Kong 通信,并授权使用具有外部给定用户 ID 的 API。
简而言之,如下(此处为授权码授予):
不是直接向 Kong 请求令牌,而是向授权服务器发出请求以获取特定 API 的令牌(硬编码或参数化,取决于您的需要),并包含需要的应用程序的客户端 ID在调用中访问(实际上你实现了/authorize
端点)
授权服务器现在需要使用您需要的任何 IdP 进行身份验证,以便您在授权服务器中拥有经过身份验证的用户
现在通过 Kong Admin API 获取您的 API 的配置代码,并点击您的 Kong 网关(端口 8443)的/oauth2/authorize
端点,包括配置密钥;请注意,您可能还需要通过 Admin API 查找应用程序客户端 ID 的客户端密码才能完成这项工作
在POST
到/oauth2/authorize
中包含客户端ID、客户端密码、经过身份验证的用户ID(来自您的自定义IdP)和可选范围;这些值将使用应用程序现在可以使用授权代码声明的访问令牌添加到对 API 的后端调用中
Kong 会给您一个授权码,您可以通过 302 重定向将其传递回应用程序(您需要为此阅读 OAuth2 规范)
应用程序使用其客户端和密钥以及授权码从 Kong 的端口 8443、URL /oauth2/token
获取访问令牌(和刷新令牌)。
这听起来比最后更复杂。我为 wicked.haufe.io 做了这个,它基于 Kong 和 node.js,并为 Kong 添加了一个开源开发者门户。以下两个项目中有很多代码展示了与任何 IdP 集成可以做的事情:
https://github.com/apim-haufe-io/wicked.portal-kong-adapter https://github.com/Haufe-Lexware/wicked.auth-passport https://github.com/Haufe-Lexware/wicked.auth-saml我们目前正在调查是否还可以为 wicked 添加默认授权服务器,但现在您必须自己滚动/分叉。
也许这有帮助,马丁
【讨论】:
感谢您的回答。我一定会更深入地研究建议。 如果我已经有一个处理身份验证(用户 + 密码)、授权(用户是否有权访问特定资源)和注册(将用户添加到与此微服务绑定的用户数据库)的微服务怎么办? )。有没有办法将用户服务与kong集成?似乎这种级别的用户交互会更加针对应用程序。 这听起来像是您可以并且也许应该使用 OAuth2 解决的问题,这是退一步,通常将授权抽象到范围中。 your 服务的详细情况如何从您在此处所述的内容中很难看出。理想情况下,您的 API 会从预先收集的信息中获得从 Kong 传递的授权和身份验证。这通常是可能的,但并非总是如此。 我很清楚,我必须将我的用户微服务变成更多的 OAuth2 服务器并让 kong 从那里使用它?另外,我假设我不能只创建一个直接与我的用户微服务交互的自定义插件,否则会太混乱吗?我绝对可以看到 OAuth2 场景在哪里会更干净。 我没有在 cmets 中执行此操作,而是为您的链接问题添加了答案:***.com/questions/46760736/…【参考方案2】:查看 Kong 的 OpenID Connect 插件 getkong.org/plugins/openid-connect-rp - 它连接到外部身份和身份验证系统。
【讨论】:
以上是关于Kong API 网关中的自定义身份验证服务的主要内容,如果未能解决你的问题,请参考以下文章
对 Kong api 网关端点的基本身份验证请求出现 CORS 错误并且未找到预检
使用带有 KONG API 网关的 cookie 进行 JWT 身份验证