Skip to content

Commit a3b2370

Browse files
DGuhrpedroigor
authored andcommitted
KEYCLOAK-19553 Fix Resteasy Bug in Authenticators for Keycloak.X
1 parent b1bcd5d commit a3b2370

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

services/src/main/java/org/keycloak/authentication/authenticators/client/AbstractClientAuthenticator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@
1717

1818
package org.keycloak.authentication.authenticators.client;
1919

20+
import org.jboss.resteasy.spi.HttpRequest;
2021
import org.keycloak.Config;
2122
import org.keycloak.authentication.ClientAuthenticator;
2223
import org.keycloak.authentication.ClientAuthenticatorFactory;
2324
import org.keycloak.models.KeycloakSession;
2425
import org.keycloak.models.KeycloakSessionFactory;
2526

27+
import javax.ws.rs.core.MediaType;
28+
2629
/**
2730
* @author <a href="mailto:[email protected]">Marek Posolda</a>
2831
*/
@@ -62,4 +65,9 @@ public boolean isUserSetupAllowed() {
6265
public String getReferenceCategory() {
6366
return null;
6467
}
68+
69+
protected boolean isFormDataRequest(HttpRequest request) {
70+
MediaType mediaType = request.getHttpHeaders().getMediaType();
71+
return mediaType != null && mediaType.isCompatible(MediaType.APPLICATION_FORM_URLENCODED_TYPE);
72+
}
6573
}

services/src/main/java/org/keycloak/authentication/authenticators/client/JWTClientAuthenticator.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.Map;
3030
import java.util.Set;
3131

32+
import javax.ws.rs.core.MediaType;
3233
import javax.ws.rs.core.MultivaluedMap;
3334
import javax.ws.rs.core.Response;
3435

@@ -37,7 +38,6 @@
3738
import org.keycloak.OAuthErrorException;
3839
import org.keycloak.authentication.AuthenticationFlowError;
3940
import org.keycloak.authentication.ClientAuthenticationFlowContext;
40-
import org.keycloak.common.Profile;
4141
import org.keycloak.common.util.Time;
4242
import org.keycloak.jose.jws.JWSInput;
4343
import org.keycloak.keys.loader.PublicKeyStorageManager;
@@ -75,6 +75,14 @@ public class JWTClientAuthenticator extends AbstractClientAuthenticator {
7575

7676
@Override
7777
public void authenticateClient(ClientAuthenticationFlowContext context) {
78+
79+
//KEYCLOAK-19461: Needed for quarkus resteasy implementation throws exception when called with mediaType authentication/json in OpenShiftTokenReviewEndpoint
80+
if(!isFormDataRequest(context.getHttpRequest())) {
81+
Response challengeResponse = ClientAuthUtil.errorResponse(Response.Status.BAD_REQUEST.getStatusCode(), "invalid_client", "Parameter client_assertion_type is missing");
82+
context.challenge(challengeResponse);
83+
return;
84+
}
85+
7886
MultivaluedMap<String, String> params = context.getHttpRequest().getDecodedFormParameters();
7987

8088
String clientAssertionType = params.getFirst(OAuth2Constants.CLIENT_ASSERTION_TYPE);

services/src/main/java/org/keycloak/authentication/authenticators/client/JWTClientSecretAuthenticator.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Map;
2626
import java.util.Set;
2727

28+
import javax.ws.rs.core.MediaType;
2829
import javax.ws.rs.core.MultivaluedMap;
2930
import javax.ws.rs.core.Response;
3031

@@ -64,6 +65,14 @@ public class JWTClientSecretAuthenticator extends AbstractClientAuthenticator {
6465

6566
@Override
6667
public void authenticateClient(ClientAuthenticationFlowContext context) {
68+
69+
//KEYCLOAK-19461: Needed for quarkus resteasy implementation throws exception when called with mediaType authentication/json in OpenShiftTokenReviewEndpoint
70+
if(!isFormDataRequest(context.getHttpRequest())) {
71+
Response challengeResponse = ClientAuthUtil.errorResponse(Response.Status.BAD_REQUEST.getStatusCode(), "invalid_client", "Parameter client_assertion_type is missing");
72+
context.challenge(challengeResponse);
73+
return;
74+
}
75+
6776
MultivaluedMap<String, String> params = context.getHttpRequest().getDecodedFormParameters();
6877

6978
String clientAssertionType = params.getFirst(OAuth2Constants.CLIENT_ASSERTION_TYPE);

0 commit comments

Comments
 (0)