使用oauth2 proxy通过Bearer token对接Keycloak授权应用失败求助
问题:Keycloak + OAuth2 Proxy 集成 Bearer Token 授权失败
背景
在Kubernetes同一命名空间部署了示例应用、OAuth2 Proxy和Keycloak,所有服务都在Nginx Ingress之后。目前已实现通过浏览器登录Keycloak完成应用授权,但使用Bearer Token调用API时遇到异常。
当前问题
- 用
curl -H "Authorization: Bearer TOKEN"发起请求,返回302重定向错误 - Postman请求返回200 OK,但响应内容是Keycloak登录页面的HTML代码
- 调整OAuth2 Proxy配置后问题仍未解决
预期目标
通过Bearer Token完成API请求授权,正常获取示例应用的输出结果
服务端点
- Keycloak:
keycloak.microservices.com - 示例应用:
app.microservices.com/demo-service - OAuth2 Proxy:
app.microservices.com/oauth2
当前 OAuth2 Proxy ConfigMap 配置
oauth2-proxy.cfg: |- provider="keycloak" provider_display_name="Keycloak" login_url="https://<DOMAIN>/realms/test/protocol/openid-connect/auth" redeem_url="https://<DOMAIN>/realms/test/protocol/openid-connect/token" validate_url="https://<DOMAIN>/realms/test/protocol/openid-connect/userinfo" profile_url="https://<DOMAIN>/realms/test/protocol/openid-connect/userinfo" skip_jwt_bearer_tokens="true" pass_authorization_header = "true" pass_access_token = "true" pass_user_headers = "true" pass_basic_auth= "true" set_authorization_header = "true" set_xauthrequest = "true" cookie_refresh = "1m" cookie_expire = "30m" request_logging="true" auth_logging="true" standard_logging="true" client_id="CLIENT_ID" client_secret="xyz" cookie_secret="xyz" cookie_secure="true" # Upstream config http_address="0.0.0.0:4180" upstreams="file:///dev/null" email_domains=["*"] oidc_issuer_url="https://<DOMAIN>/realms/nginx-plus" cookie_domains=["*"] scope="openid" whitelist_domains=["*"]
错误日志
Error retrieving session from token in Authorization header: [unable to verify bearer token, not implemented]
示例应用 Ingress 注解
nginx.ingress.kubernetes.io/auth-signin: http://$host/oauth2/start?rd=$escaped_request_uri nginx.ingress.kubernetes.io/auth-url: http://oauth-proxy.keycloak.svc.cluster.local:4180/oauth2/auth nginx.ingress.kubernetes.io/auth-response-headers: "x-auth-request-user, x-auth-request-email"
修复方案
1. 修正 OAuth2 Proxy 核心配置
这是解决问题的关键:
- 关闭跳过JWT Bearer Token验证:将
skip_jwt_bearer_tokens="true"改为skip_jwt_bearer_tokens="false"。这个参数设为true时,OAuth2 Proxy会忽略请求头中的Bearer Token,直接触发重定向登录流程,导致API请求失败。 - 统一Realm配置:当前
oidc_issuer_url指向/realms/nginx-plus,但其他授权端点用的是/realms/test,存在不一致。修改为oidc_issuer_url="https://<DOMAIN>/realms/test",确保OAuth2 Proxy能正确获取Keycloak的JWKS公钥来验证Token。 - 添加JWKS端点(可选):手动指定Keycloak的公钥端点,避免自动发现异常:
oidc_jwks_url="https://<DOMAIN>/realms/test/protocol/openid-connect/certs"
2. 优化 Ingress 配置(可选)
- 明确Auth请求方法,避免歧义:
nginx.ingress.kubernetes.io/auth-method: GET - 若需针对API路径优先处理Bearer Token,添加
snippet保留Authorization头:nginx.ingress.kubernetes.io/auth-snippet: | auth_request_set $auth_header $http_authorization; proxy_set_header Authorization $auth_header;
3. 验证Token有效性
先确认Token本身没问题:
curl -H "Authorization: Bearer YOUR_TOKEN" https://keycloak.microservices.com/realms/test/protocol/openid-connect/userinfo
如果返回用户信息,说明Token有效;如果报错,检查Token的aud(受众)是否匹配OAuth2 Proxy的client_id,以及scope是否包含openid。
4. 其他配置检查
- 保留
pass_authorization_header="true"和set_authorization_header="true",确保Bearer Token能传递给后端应用。 - 确认
scope="openid"已配置,这是OIDC验证的必要范围。
内容的提问来源于stack exchange,提问作者GargiM
相关产品推荐
相关产品推荐

