调用Kong代理端点遇连接拒绝,OIDC与Keycloak配置求助
咱们从最基础的环节开始一步步排查,缩小问题范围:
1. 先确认后端服务本身是否可用
跳过Kong,直接访问你的/listProducts/端点,执行以下命令测试:
curl http://{后端服务IP:端口}/listProducts/ --header 'Accept: application/json'
如果这个请求也返回连接拒绝,那问题根本不在Kong或OIDC配置上,优先检查后端服务是否启动、端口是否正确,或者是否有防火墙拦截了请求。
2. 检查Kong的上游(Upstream)和路由(Route)配置
这是网关代理最容易出错的环节:
- 确认你创建的上游服务,IP和端口完全匹配后端服务的真实地址,别用
localhost(如果Kong和后端不在同一机器,localhost指的是Kong自身,而非后端服务) - 检查路由的路径规则:你的路由
paths是否设置为/listProducts/?有没有配置路径重写规则导致请求被转发到错误的后端路径? - 可以用Kong Admin API验证配置,比如查询目标路由的详情:
curl http://localhost:8001/routes/{你的路由ID}
重点查看upstream_id是否关联到正确的上游服务,paths是否匹配你的请求路径。
3. 修正OIDC插件的配置错误
从你给出的配置来看,有几个明显的问题需要调整:
3.1 Discovery地址不匹配
你获取token用的是experimental realm,但插件的discovery地址指向了master realm,这会导致Kong无法正确获取OIDC端点信息,修改为:
http://{MyHostIP}:8180/auth/realms/experimental/.well-known/openid-configuration
另外你获取token用的是HTTP协议,所以discovery地址也保持HTTP即可(你已经设置ssl verify: no,这个配置没问题)。
3.2 客户端认证方式冲突
你提到客户端是公开访问类型,但插件里设置了token endpoint auth method: client_secret_post——公开客户端(比如SPA、移动APP)没有client_secret,也不能使用需要secret的认证方式,应该改成:
token endpoint auth method: none
同时将client secret留空,因为公开客户端不需要secret。
3.3 客户端权限配置
确保Keycloak里给Kong使用的客户端(插件配置的client id: kong)开启了Token Introspection权限:
- 登录Keycloak控制台,进入
experimentalrealm → 客户端 → 找到kong客户端 - 打开
Service Accounts Enabled开关 - 切换到
Service Account Roles标签,添加realm-management下的introspect tokens角色 - 保存配置
3.4 验证Introspection端点可用性
直接测试Keycloak的introspection端点是否正常工作:
curl http://{MyHostIP}:8180/auth/realms/experimental/protocol/openid-connect/token/introspect \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=kong' \ --data-urlencode 'client_secret=myClientSecret' \ --data-urlencode 'token=你的Bearer token'
如果返回{"active":true},说明端点正常;如果返回错误,根据提示排查(比如客户端权限不足、token无效)。
4. 检查网络连通性
- 在Kong所在的机器/容器中,测试能否访问Keycloak:
curl http://{MyHostIP}:8180/auth/realms/experimental
如果不通,说明Kong和Keycloak之间存在网络隔离(比如容器网络不通、防火墙规则拦截),先解决网络问题。
- 同样在Kong机器上测试能否访问后端服务地址,确保Kong能正常连接后端。
5. 查看日志定位具体错误
日志是排查问题的核心依据:
- Kong日志:如果是容器部署,执行
docker logs kong;如果是主机部署,查看/usr/local/kong/logs/error.log和access.log,寻找连接后端失败、token验证错误的具体信息。 - Keycloak日志:查看Keycloak的日志,确认introspection请求是否到达,是否有权限错误或其他异常。
按这个顺序排查,应该能快速定位连接拒绝的原因。
内容的提问来源于stack exchange,提问作者Mohit

