You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:56:01