K8s部署WSO2调用REST API获取应用列表被重定向至登录页
WSO2 Kubernetes部署API调用重定向到登录页排查与解决
排查思路
按从服务本身到接入层的顺序逐层验证,避免无效配置变更:
- 先跳过Ingress,直接在集群内访问WSO2 Pod/Service IP+端口,分别携带、不携带认证信息调用目标API,确认WSO2服务本身是否正常
- 检查API请求是否携带WSO2要求的合法认证凭证,WSO2管理类REST API默认禁止匿名访问,未携带认证的请求本身就会被重定向到登录页
- 检查Ingress的路径匹配、重写规则是否正确,是否存在路径截断、租户上下文丢失导致后端WSO2无法识别API路由的问题
- 检查Ingress层是否挂载了全局认证、鉴权中间件,是否在流量到达WSO2之前就被中间件拦截重定向
- 检查WSO2实例的REST API开关、CSRF校验、CORS、租户状态配置是否符合API调用要求
解决方案
- 先确认服务本身可用性
进入K8s集群同命名空间下的调试Pod,直接用WSO2 Service的ClusterIP调用接口,先不带认证头确认返回302跳登录,再带上合法认证头调用,示例命令:
如果直连带认证能正常返回应用列表JSON,说明WSO2服务本身无问题,故障点在Ingress层;如果直连带认证依然跳登录,优先调整WSO2配置。# 直连Service测试,替换对应IP、端口、管理员账号密码,-k参数跳过自签名证书校验 curl -k -X GET "https://<WSO2_SERVICE_CLUSTERIP>:9443/t/carbon.super/api/server/v1/applications?limit=30&offset=0" \ -H "accept: application/json" \ -u admin:<你的管理员密码> - 修正WSO2服务配置
编辑WSO2的deployment.toml配置文件,确认以下配置项正确:
配置修改后重启WSO2 Pod生效,再重复直连测试直到返回正常结果。[server] enable_rest_api = true # 强制开启REST API能力 hostname = "<你的对外访问域名>" # 和Ingress配置的base_URL保持一致 [csrf] enabled = true excluded_contexts = ["/t/*/api/server/v1/*"] # 把API路径加入CSRF校验白名单,避免跨域调用被拦截 [cors] enabled = true allowed_origins = ["<生产环境替换为实际调用来源域名,测试可临时填*>"] supported_methods = ["GET", "POST", "PUT", "DELETE", "OPTIONS"] - 修正Ingress配置
不要使用会截断路径的重写规则,确保/t/<tenant_domain>/api/...全路径透传给WSO2后端,以Nginx Ingress为例,正确的路径配置片段如下:
注意WSO2默认服务端口走HTTPS协议,必须配置backend-protocol为HTTPS,否则会出现协议不匹配导致的异常跳转。如果你的Ingress集群安装了oauth2-proxy、全局鉴权等插件,需要把apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wso2-ingress annotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: <你的对外base_URL域名> http: paths: - path: /t(/|$)(.*) pathType: ImplementationSpecific backend: service: name: <WSO2对应的K8s Service名称> port: number: 9443/t/*/api/server/v1/*路径加入插件的鉴权白名单,避免Ingress层拦截API请求返回302。 - 最终调用验证
走对外域名调用API时必须携带合法认证头,支持Basic Auth或者Bearer Token两种方式,不要裸发请求:
正常调用会返回200状态码和JSON格式的应用列表,不会再重定向到管理UI登录页。curl -X GET "https://<base_URL>/t/carbon.super/api/server/v1/applications?limit=30&offset=0" \ -H "accept: application/json" \ -H "Authorization: Bearer <提前通过WSO2 OAuth接口申请的有效令牌>"
内容的提问来源于stack exchange,提问作者Nima Maghsoodi
相关产品推荐
相关产品推荐

