KONG网关同一路由配置JWT与API Key双认证,如何实现二者共存生效?
Kong Gateway:同一路由支持JWT与API密钥任选认证的配置方案
问题原因
默认情况下,Kong的认证插件为强制校验模式:只要路由上启用了多个认证插件,每个插件会独立检查请求是否携带对应凭证,缺少则直接拒绝请求。这就是你使用JWT时收到"message": "No API key found in request"、使用API密钥时收到"message": "Unauthorized"的原因——未携带的另一种认证凭证触发了对应插件的校验失败。
解决方案
方法1:使用Composite组合插件(推荐)
Kong的Composite插件支持将多个认证插件组合为**“或”逻辑**:只要其中一种认证方式通过,请求即可放行。
操作步骤:
清理原有独立插件(可选)
先列出目标路由下的插件,获取JWT和Key Auth插件的ID:curl http://localhost:8001/routes/my-route/plugins删除两个插件(替换
<plugin-id>为实际ID):curl -X DELETE http://localhost:8001/plugins/<jwt-plugin-id> curl -X DELETE http://localhost:8001/plugins/<key-auth-plugin-id>创建Composite组合插件
一次性配置JWT和Key Auth为“或”逻辑:curl -i -X POST http://localhost:8001/routes/my-route/plugins \ --data name=composite \ --data config.plugins[0].name=jwt \ --data config.plugins[0].config.claims_to_verify=exp \ --data config.plugins[1].name=key-auth \ --data config.condition=orconfig.condition=or:核心配置,指定多个插件只需通过其中一个即可。- 可根据需求添加JWT或Key Auth的其他配置参数(比如JWT的
secret_is_base64、Key Auth的key_names等)。
方法2:调整认证插件的anonymous参数(兼容旧版本Kong)
如果你的Kong版本不支持Composite插件,可以通过给每个认证插件设置anonymous参数,实现“降级匿名+多认证互斥”的逻辑:
操作步骤:
创建匿名消费者
curl -i -X POST http://localhost:8001/consumers \ --data username=anonymous记录返回的消费者ID(
id字段)。更新JWT插件
设置anonymous为匿名消费者ID,让未携带JWT的请求降级为匿名身份:curl -i -X PATCH http://localhost:8001/plugins/<jwt-plugin-id> \ --data config.anonymous=<anonymous-consumer-id>更新Key Auth插件
同理设置Key Auth插件的anonymous参数:curl -i -X PATCH http://localhost:8001/plugins/<key-auth-plugin-id> \ --data config.anonymous=<anonymous-consumer-id>注意:需确保匿名消费者没有目标服务的访问权限,这样只有当请求携带有效JWT或API密钥时,才会使用对应有权限的消费者身份放行;若两种凭证都未携带,匿名身份会被拒绝。
总结
- 优先选择Composite组合插件,逻辑清晰、配置简洁,是Kong官方推荐的多认证共存方案。
- 旧版本Kong可使用
anonymous参数方案,但需额外管理匿名消费者的权限。
内容的提问来源于stack exchange,提问作者Lan Lin
相关产品推荐
相关产品推荐

