为何quarkus.oidc.credentials.secret配置被忽略?bearer-only为何不允许?
问题1:初始状态client-id、secret配置不生效原因
当仅使用quarkus-oidc扩展、未开启Keycloak策略校验时,Quarkus OIDC默认运行在无状态本地JWT校验模式:
- 仅需配置
quarkus.oidc.auth-server-url即可正常工作,Quarkus会自动从对应Keycloak Realm的OIDC发现端点拉取签名公钥,在本地完成JWT签名合法性、过期时间的校验 - 该模式下没有显式开启受众(aud)校验的话,不会验证JWT的受众字段与配置的client-id是否一致,因此client-id填错或者注释都不会触发错误
- 该模式不需要和Keycloak做后端主动交互,secret配置完全不会被调用,因此不影响运行
问题2:开启策略校验后报
Bearer-only not allowed原因 引入quarkus-keycloak-authorization扩展并开启策略强制校验后,Quarkus的认证授权逻辑发生变化:
- 不再仅做本地JWT校验,需要主动向Keycloak发起授权请求,携带当前请求的资源、上下文信息,查询当前用户是否有权限访问对应资源
- Keycloak中
bearer-only类型的客户端定位为仅作为资源服务接收Bearer令牌校验,不允许主动发起OAuth2授权请求,因此Quarkus用该类型客户端调用授权接口时会被Keycloak直接拒绝,抛出对应错误 - 该模式下需要用client-id和secret和Keycloak做服务端身份认证,因此配置不再被忽略,填错会直接触发认证失败错误
修复建议:将Keycloak中
backend-client的访问类型从bearer-only修改为confidential即可正常使用策略校验功能。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

