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-id
、x=consumer-username
、x-consumer-groups
等......
如果您愿意为数据库中的每个用户添加消费者条目,请将消费者的自定义 ID 与数据库的真实用户 ID 相关联。
然后,对于每个请求,您将能够确定谁是发布者。
如果您想了解更多信息但仍想使用 JWT 插件,则必须使用额外的组件(JWT 库、第三方服务等)。
【讨论】:
以上是关于Kong 和 JWT - API 应如何从令牌中提取信息的主要内容,如果未能解决你的问题,请参考以下文章
Kong + Keycloak + OAuth:jwt-keycloak 还是 oauth2 插件?
React Native - 如何使用 JWT 令牌从 WordPress REST API 获取私人帖子