Kong 和 JWT - API 应如何从令牌中提取信息

Posted

技术标签:

【中文标题】Kong 和 JWT - API 应如何从令牌中提取信息【英文标题】:Kong and JWT - how the APIs should extract the info from the token 【发布时间】:2017-10-12 15:50:48 【问题描述】:

今天我开始研究 Kong 以及它如何通过插件提供一些功能。我正在阅读 [enter link description here][Plugins] 页面并开始查看 JWT。

Kong 似乎提供了这些端点(不仅如此):

创建消费者; 创建/删除 JWT 凭据; 使用从第 2 步获取的凭据生成 JWT 令牌;

一旦激活,Kong 将验证 JWT(和声明)的有效性,并在请求有效时将请求转发到 API 端点。

这是我的问题:

    由于 JWT 还用于携带信息(例如客户 ID、客户角色),以便在每个 API 中始终拥有用户信息的子集,而无需每次查询数据库或其他端点,每个 API解析 JWT 令牌并提取其中的信息?

    想象一下,我想创建一个与 Kong 交互的单页应用程序,它隐藏了许多微服务。哪个是使用 JWT 的最佳方式,每个后端微服务都可以解析 JWT 令牌以检索例如发出请求的用户 ID?

    kong 是否提供 api 来解析 JWT 令牌?

【问题讨论】:

【参考方案1】:

    您可以使用 JWT 库(例如 JJWT)在 API 端点实现中解码令牌,也可以使用专门的微服务为您解码

    您将在对用户进行身份验证时生成并访问令牌,然后在每个请求的标头中发送它。这样,您的微服务可以通过 #1

    中描述的选项之一验证用户

    看起来不像

【讨论】:

【参考方案2】:

请检查以下链接,该插件将解析您的 JWT 令牌并对其进行解码: https://github.com/wego/kong-jwt-claim-headers

另外,如果您需要帮助来设置 jwt 插件,请检查: Kong-auth0-jwt

【讨论】:

【参考方案3】:

另一种选择是使用 kong-oidc 并将其部署为资源服务器,验证 OAuth 2.0 JWT 令牌。

【讨论】:

【参考方案4】:

我也有类似的要求。我通过在我的 spring-boot 应用程序中添加 JwtFilter 来实现它,它将提取 JWT 令牌,解析它并将其设置在 SecurityContextHolder 中。我可以在需要的地方通过从SecurityContextHolder 获取令牌来提取用户信息。不过,我面临的挑战是识别注册 JWT 时使用的secret,因为我无法控制它是如何在消费者端生成的。

【讨论】:

【参考方案5】:

实际上,一旦 Kong 验证了与消费者关联的 JWT 令牌,它就会在请求标头中添加额外的信息,例如 x-consumer-custom-idx=consumer-usernamex-consumer-groups 等......

如果您愿意为数据库中的每个用户添加消费者条目,请将消费者的自定义 ID 与数据库的真实用户 ID 相关联。

然后,对于每个请求,您将能够确定谁是发布者。

如果您想了解更多信息但仍想使用 JWT 插件,则必须使用额外的组件(JWT 库、第三方服务等)。

【讨论】:

以上是关于Kong 和 JWT - API 应如何从令牌中提取信息的主要内容,如果未能解决你的问题,请参考以下文章

Kong + Keycloak + OAuth:jwt-keycloak 还是 oauth2 插件?

React Native - 如何使用 JWT 令牌从 WordPress REST API 获取私人帖子

如何从节点 api 中的获取请求中解码 JWT 令牌

PHP:如何使用 JWT 从 API 注销

如何通过 Java/Kotlin API 从 KeyCloak 请求 JWT 令牌

使用 JWT 令牌保护 asp.net 核心 Web api 时如何从 Azure AD 获取用户