Spring Boot集成Keycloak如何将客户端凭证放在请求体中发送
解决方案
核心逻辑
Keycloak Spring Boot Starter的客户端凭证传递逻辑由ClientCredentialsProvider接口的实现类控制,默认实现ClientIdAndClientCredentialsProvider会将凭证放在Authorization请求头中传输,你可以通过自定义该接口的实现,替换默认逻辑来满足定制版Keycloak的要求。
具体实现步骤
- 自定义
ClientCredentialsProvider实现类
import org.keycloak.adapters.KeycloakDeployment; import org.keycloak.adapters.authentication.ClientCredentialsProvider; import org.keycloak.representations.adapters.config.AdapterConfig; import javax.ws.rs.core.Form; import java.util.Map; public class FormBodyClientCredentialsProvider implements ClientCredentialsProvider { @Override public String getId() { // 自定义提供者的唯一标识,后续配置要用到 return "form-body"; } @Override public void init(AdapterConfig adapterConfig, Object o) { // 无额外初始化需求可留空 } @Override public void setClientCredentials(KeycloakDeployment keycloakDeployment, Map<String, String> requestHeaders, Form form) { // 不在请求头添加凭证 // 将客户端凭证写入请求体form参数 form.param("client_id", keycloakDeployment.getResourceName()); form.param("client_secret", keycloakDeployment.getResourceCredentials().get("secret").toString()); } }
- 注册自定义实现类
在项目resources/META-INF/services目录下新建名为org.keycloak.adapters.authentication.ClientCredentialsProvider的文件,文件内写入自定义实现类的全限定名,示例:
com.yourproject.config.FormBodyClientCredentialsProvider
- 修改配置启用自定义提供者
在application.yml或application.properties中添加如下配置:
keycloak: credentials: provider: form-body # 和自定义实现类getId()返回的标识保持一致
验证方法
项目启动后触发令牌申请请求,查看请求报文即可看到client_id、client_secret已放在请求体中传输,请求头不再携带Basic认证的Authorization头。
适配说明
如果使用Keycloak 17+的Quarkus版对应Starter,仅需调整相关类的包路径即可,核心逻辑不变。
内容的提问来源于stack exchange,提问作者mifol68042
相关产品推荐
相关产品推荐

