使用Keycloak作为Oauth2_proxy提供商调用/userinfo API报invalid_token错误
我来帮你一步步排查这个问题,从日志里的invalid_token和Token verification failed来看,核心问题是oauth2-proxy拿到的Token在调用Keycloak的userinfo接口时验证不通过,下面是几个最可能的原因和排查步骤:
1. 优先检查URL一致性(最可能的元凶)
你配置的login-url用的是http://localhost:7575/...,但redeem-url和validate-url用的是http://172.20.0.10:8080/...,这两个Base URL不一致会直接导致Token验证失败。
Keycloak生成的JWT Token里会包含一个iss(签发者)字段,这个字段的值是Keycloak Realm配置里的Issuer URL。oauth2-proxy在验证Token时,会检查Token的iss是否和它访问Keycloak接口用的Base URL匹配,如果不匹配就会判定Token无效。
排查步骤:
- 登录Keycloak后台,进入你的
masterRealm(或者你创建的自定义Realm) - 点击左侧菜单的「Realm Settings」→「General」,找到「Endpoints」下的「OpenID Endpoint Configuration」,点击这个链接
- 在打开的JSON里找到
issuer字段,比如应该是http://172.20.0.10:8080/auth/realms/master - 把oauth2-proxy的
login-url、redeem-url、validate-url全部改成用这个一致的Base URL,比如login-url应该改成http://172.20.0.10:8080/auth/realms/master/protocol/openid-connect/auth - 重启oauth2-proxy容器,重新测试
2. 检查Scope配置是否正确
你当前指定的-scope='test-scope'可能缺少了访问userinfo接口必需的权限。默认情况下,Keycloak的userinfo接口要求Token包含openid scope,否则即使Token有效,也会被拒绝访问(不过你的错误是验证失败,也有可能是Scope导致Token的Claims不完整)。
排查步骤:
- 先临时把oauth2-proxy的scope改成默认的必要值:
-scope='openid email profile' - 同时检查Keycloak客户端的配置:进入你的
abcd-client客户端,点击「Client Scopes」标签,确认openid、email、profile这些默认Scope已经添加到客户端的「Assigned Default Client Scopes」里 - 重启oauth2-proxy后测试,如果问题解决,再去配置你的
test-scope,确保它包含了openid的权限或者相关的用户信息读取权限
3. 验证Token的Audience(aud)是否匹配
Keycloak生成的Token里的aud(受众)字段应该是你的客户端IDabcd-client,如果这个字段不匹配,oauth2-proxy验证Token时也会失败。
排查步骤:
- 手动调用Keycloak的
/token接口获取一个Token(你说这个接口正常,所以可以直接拿) - 把Token复制到任意JWT解析工具(比如本地打开jwt.io,无需联网即可解析)里,查看
aud字段的值 - 如果
aud不是abcd-client,检查Keycloak客户端的配置:进入客户端→「Advanced」→「OpenID Connect Compatibility Modes」,确保没有修改过「Audience」相关的配置;另外确认客户端的「Access Type」是confidential(因为你用了Client Secret,这个应该是对的,但再确认下)
4. 检查Keycloak和oauth2-proxy的版本兼容性
你用的oauth2-proxy是v5.1.1版本,这个版本比较老(2020年左右发布的),如果你的Keycloak版本是较新的(比如Keycloak 11+),可能存在一些协议兼容性问题。
排查步骤:
- 查看你的Keycloak版本(在Keycloak后台首页可以看到)
- 如果Keycloak版本高于10.x,尝试升级oauth2-proxy到较新的版本(比如v7+或更高),新版本对Keycloak的支持更完善
内容的提问来源于stack exchange,提问作者Sumit Jindal

