使用 Kong 进行身份验证

Posted

技术标签:

【中文标题】使用 Kong 进行身份验证【英文标题】:Authentication with Kong 【发布时间】:2017-09-07 03:09:18 【问题描述】:

我正在寻找 Kong 来替换我当前的手动 NodeJS API 网关。目前,我有一个用户服务,通过在登录时提供 JWT 来处理身份验证(用 Django 编写),然后客户端通过标头传入该 JWT。然后,我当前的 API 网关拦截任何调用,对用户服务进行验证调用,并将 JWT 标头替换为 X-User-IdX-User-Email

据我所知,Kong 可以做大致相同的事情。我试图弄清楚这应该如何在完美的世界中工作。我仍然有机会更换大部分基础设施,因此重写一些服务并非完全不可能。

所以,在我看来,会发生以下情况:

    用户在我的网站上注册。然后我在 Kong 上使用他们的用户名/ID 创建一个新的消费者 用户登录。这是我卡住的地方。我是否登录(或者在这种情况下,只是将用户认证为所述用户),向 Kong 询问该消费者的 JWT,然后返回?如果我想在 JWT 的有效负载中添加更多数据怎么办?当 JWT 过期时,Kong 那边会发生什么? 当用户请求服务时,Kong 会从标头中嗅出 JWT,将其替换为 X-Consumer-* - 是否正确?

如果我的想法是错误的,或者如果有更好的方法来实现这一点,请纠正我。我对整个微服务的事情还很陌生。

【问题讨论】:

【参考方案1】:

我正在研究类似的设置,这些是我目前的发现/结论:

用户注册必须是您描述的方式。

登录后,我相信有两种可能的方法来解决这个问题:

    将 consumer_id 存储在您的用户数据库中, 将 jwt 密钥和机密存储在您的用户数据库中。

在场景 1 中,您必须从 kong 获取 jwt 密钥和秘密并生成 jwt 令牌并使用此令牌向您的 kong 服务发出请求。

场景 2 与场景 1 几乎相同,只是您无需向 kong 发出任何请求即可生成 jwt 令牌。

您可以向 jwt 令牌添加额外的有效负载参数,但这些参数不会传递给您的上游服务。然而,这个插件似乎解决了这个问题(我还没有测试过):

https://github.com/wshirey/kong-plugin-jwt-claims-headers

Kong 在授权后将 jwt 消费者的 custom_id 和用户名传递给上游服务,如下所示:

x-consumer-custom-id: [245]
x-consumer-username: ['my-test-user']
x-consumer-id: ['1e9e25dd-396f-4195-94fc-f2a8bd8447a2']

它还传递了整个授权标头

【讨论】:

【参考方案2】:

我已经使用openId 插件配置了Kong 来管理身份验证过程。我发现的主要问题是更新的插件版本仅在 Kong 企业中可用。奇怪的是,这个插件使用了来自 Lua resty 的社区库,因此您可以使用开源库实现相同的 OpenID 流程。

我写了一篇关于这个流程如何工作的文章here

另外,如果您需要一个工作示例,请查看this repo。

【讨论】:

【参考方案3】:

您可以开发和使用 kong 自定义插件来拦截对您的身份验证服务的调用。

https://konghq.com/blog/custom-authentication-and-authorization-framework-with-kong/

【讨论】:

以上是关于使用 Kong 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 KONG API 网关的 cookie 进行 JWT 身份验证

在 Kong API 网关中使用 .jks 密钥对 JWT 令牌进行身份验证

Kong Basic Auth 使用来自其他服务的身份验证来授权路由请求

Kong(v1.0.2)认证

用户注册+与kong集成的微服务的身份验证

在 Kong 中启用基本身份验证和会话插件时如何获取用户 ID?