From 9515cfa36a2db53767f9a85eda7901c82f22811f Mon Sep 17 00:00:00 2001 From: George Jahad Date: Thu, 17 Apr 2025 16:20:38 -0700 Subject: [PATCH 1/5] basic changes Signed-off-by: George Jahad --- .../JaasClientOauthLoginCallbackHandler.java | 6 ++-- .../io/strimzi/kafka/oauth/common/Config.java | 9 +++++- .../oauth/common/OAuthAuthenticator.java | 31 +++++++++++++------ ...authOverPlainValidatorCallbackHandler.java | 4 ++- .../oauth/HydraAuthenticationTest.java | 3 +- .../testsuite/oauth/auth/BasicTests.java | 4 ++- .../oauth/auth/JwtManipulationTests.java | 4 ++- .../oauth/auth/OAuthOverPlainTests.java | 5 +-- .../strimzi/testsuite/oauth/authz/Common.java | 5 +-- .../testsuite/oauth/authz/FloodTest.java | 3 +- .../oauth/auth/ErrorReportingTests.java | 10 ++++-- .../mockoauth/AuthorizationEndpointsTest.java | 4 ++- .../mockoauth/ClientAssertionAuthTest.java | 7 +++-- .../testsuite/oauth/mockoauth/Common.java | 4 ++- .../oauth/mockoauth/JWKSKeyUseTest.java | 4 ++- ...asswordAuthAndPrincipalExtractionTest.java | 4 ++- 16 files changed, 76 insertions(+), 31 deletions(-) diff --git a/oauth-client/src/main/java/io/strimzi/kafka/oauth/client/JaasClientOauthLoginCallbackHandler.java b/oauth-client/src/main/java/io/strimzi/kafka/oauth/client/JaasClientOauthLoginCallbackHandler.java index 53b9eb1f..8c741ba3 100644 --- a/oauth-client/src/main/java/io/strimzi/kafka/oauth/client/JaasClientOauthLoginCallbackHandler.java +++ b/oauth-client/src/main/java/io/strimzi/kafka/oauth/client/JaasClientOauthLoginCallbackHandler.java @@ -73,6 +73,7 @@ public class JaasClientOauthLoginCallbackHandler implements AuthenticateCallback private String scope; private String audience; private URI tokenEndpoint; + private String grantType; private boolean isJwt; private int maxTokenExpirySeconds; @@ -152,6 +153,7 @@ public void configure(Map configs, String saslMechanism, List oauthConfig = new HashMap<>(); oauthConfig.put(ClientConfig.OAUTH_TOKEN_ENDPOINT_URI, tokenEndpointUri); diff --git a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/BasicTests.java b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/BasicTests.java index 3a7e4356..6e1a2fe8 100644 --- a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/BasicTests.java +++ b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/BasicTests.java @@ -28,6 +28,7 @@ import java.util.Properties; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.loginWithClientSecret; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.kafka.oauth.common.TokenIntrospection.introspectAccessToken; import static io.strimzi.testsuite.oauth.auth.Common.buildConsumerConfigOAuthBearer; import static io.strimzi.testsuite.oauth.auth.Common.buildProducerConfigOAuthBearer; @@ -253,7 +254,8 @@ void accessTokenWithIntrospection() throws Exception { final String clientSecret = "kafka-producer-client-secret"; // First, request access token using client id and secret - TokenInfo info = loginWithClientSecret(URI.create(tokenEndpointUri), null, null, clientId, clientSecret, true, null, null, true); + TokenInfo info = loginWithClientSecret(URI.create(tokenEndpointUri), null, null, clientId, clientSecret, true, null, null, true, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); Map oauthConfig = new HashMap<>(); oauthConfig.put(ClientConfig.OAUTH_ACCESS_TOKEN, info.token()); diff --git a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/JwtManipulationTests.java b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/JwtManipulationTests.java index fb132668..0a7cb608 100644 --- a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/JwtManipulationTests.java +++ b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/JwtManipulationTests.java @@ -40,6 +40,7 @@ import static io.strimzi.testsuite.oauth.auth.Common.buildProducerConfigOAuthBearer; import static io.strimzi.testsuite.oauth.auth.Common.loginWithUsernamePassword; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; public class JwtManipulationTests { @@ -224,7 +225,8 @@ private String getOriginalToken() throws IOException { // first, request access token using client id and secret TokenInfo info = OAuthAuthenticator.loginWithClientSecret(URI.create(tokenEndpointUri), null, null, - "kafka-producer-client", "kafka-producer-client-secret", true, null, null, true); + "kafka-producer-client", "kafka-producer-client-secret", true, null, null, true, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); return info.token(); } diff --git a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/OAuthOverPlainTests.java b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/OAuthOverPlainTests.java index 0d04ae63..a81bd8e0 100644 --- a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/OAuthOverPlainTests.java +++ b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/OAuthOverPlainTests.java @@ -27,6 +27,7 @@ import java.util.concurrent.ExecutionException; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.loginWithClientSecret; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.auth.Common.buildConsumerConfigPlain; import static io.strimzi.testsuite.oauth.auth.Common.buildProducerConfigPlain; import static io.strimzi.testsuite.oauth.auth.Common.poll; @@ -64,7 +65,7 @@ static void accessTokenOverPlainWithClientCredentialsDisabled() throws Exception // first, request access token using client id and secret TokenInfo info = loginWithClientSecret(URI.create(tokenEndpointUri), null, null, - "team-a-client", "team-a-client-secret", true, null, null, true); + "team-a-client", "team-a-client-secret", true, null, null, true, OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); Map plainConfig = new HashMap<>(); plainConfig.put("username", "service-account-team-a-client"); @@ -218,7 +219,7 @@ static void accessTokenOverPlainWithIntrospection() throws Exception { // first, request access token using client id and secret TokenInfo info = loginWithClientSecret(URI.create(tokenEndpointUri), null, null, - "team-a-client", "team-a-client-secret", true, null, null, true); + "team-a-client", "team-a-client-secret", true, null, null, true, OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); Map plainConfig = new HashMap<>(); plainConfig.put("username", "service-account-team-a-client"); diff --git a/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/Common.java b/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/Common.java index a61176ba..a67e5a9e 100644 --- a/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/Common.java +++ b/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/Common.java @@ -44,6 +44,7 @@ import java.util.concurrent.ExecutionException; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.loginWithClientSecret; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.urlencode; @SuppressFBWarnings({"THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", "THROWS_METHOD_THROWS_RUNTIMEEXCEPTION", "RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT"}) @@ -93,9 +94,9 @@ static void produceToTopic(String topic, Properties config) throws Exception { void authenticateAllActors() throws IOException { tokens.put(TEAM_A_CLIENT, loginWithClientSecret(URI.create(TOKEN_ENDPOINT_URI), null, null, - TEAM_A_CLIENT, TEAM_A_CLIENT + "-secret", true, null, null, true).token()); + TEAM_A_CLIENT, TEAM_A_CLIENT + "-secret", true, null, null, true, OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK).token()); tokens.put(TEAM_B_CLIENT, loginWithClientSecret(URI.create(TOKEN_ENDPOINT_URI), null, null, - TEAM_B_CLIENT, TEAM_B_CLIENT + "-secret", true, null, null, true).token()); + TEAM_B_CLIENT, TEAM_B_CLIENT + "-secret", true, null, null, true, OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK).token()); tokens.put(BOB, loginWithUsernamePassword(URI.create(TOKEN_ENDPOINT_URI), BOB, BOB + "-password", "kafka-cli")); tokens.put(ZERO, loginWithUsernamePassword(URI.create(TOKEN_ENDPOINT_URI), diff --git a/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/FloodTest.java b/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/FloodTest.java index efb7b6f6..11380fcc 100644 --- a/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/FloodTest.java +++ b/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/FloodTest.java @@ -26,6 +26,7 @@ import java.util.concurrent.atomic.AtomicInteger; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.loginWithClientSecret; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; @SuppressFBWarnings({"THROWS_METHOD_THROWS_RUNTIMEEXCEPTION", "THROWS_METHOD_THROWS_CLAUSE_THROWABLE"}) public class FloodTest extends Common { @@ -159,7 +160,7 @@ private void obtainAndStoreToken(String producerPrefix, HashMap String secret = clientId + "-secret"; tokens.put(clientId, loginWithClientSecret(URI.create(TOKEN_ENDPOINT_URI), null, null, - clientId, secret, true, null, null, true).token()); + clientId, secret, true, null, null, true, OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK).token()); } diff --git a/testsuite/keycloak-errors-tests/src/test/java/io/strimzi/testsuite/oauth/auth/ErrorReportingTests.java b/testsuite/keycloak-errors-tests/src/test/java/io/strimzi/testsuite/oauth/auth/ErrorReportingTests.java index bb20ca78..f4d1b5d6 100644 --- a/testsuite/keycloak-errors-tests/src/test/java/io/strimzi/testsuite/oauth/auth/ErrorReportingTests.java +++ b/testsuite/keycloak-errors-tests/src/test/java/io/strimzi/testsuite/oauth/auth/ErrorReportingTests.java @@ -21,6 +21,7 @@ import java.util.concurrent.ExecutionException; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.loginWithClientSecret; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.auth.Common.buildProducerConfigOAuthBearer; import static io.strimzi.testsuite.oauth.auth.Common.buildProducerConfigPlain; import static io.strimzi.testsuite.oauth.common.TestUtil.assertTrueExtra; @@ -172,7 +173,8 @@ private void forgedJwtSig() throws Exception { final String clientSecret = "kafka-producer-client-secret"; // first, request access token using client id and secret - TokenInfo info = loginWithClientSecret(URI.create(tokenEndpointUri), null, null, clientId, clientSecret, true, null, null, true); + TokenInfo info = loginWithClientSecret(URI.create(tokenEndpointUri), null, null, clientId, clientSecret, true, null, null, true, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); Map oauthConfig = new HashMap<>(); String tokenWithBrokenSig = info.token().substring(0, info.token().length() - 6) + "ffffff"; @@ -213,7 +215,8 @@ private void forgedJwtSigIntrospect() throws Exception { final String clientSecret = "kafka-producer-client-secret"; // first, request access token using client id and secret - TokenInfo info = loginWithClientSecret(URI.create(tokenEndpointUri), null, null, clientId, clientSecret, true, null, null, true); + TokenInfo info = loginWithClientSecret(URI.create(tokenEndpointUri), null, null, clientId, clientSecret, true, null, null, true, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); Map oauthConfig = new HashMap<>(); String tokenWithBrokenSig = info.token().substring(0, info.token().length() - 6) + "ffffff"; @@ -254,7 +257,8 @@ private void expiredJwtToken() throws Exception { final String clientSecret = "kafka-producer-client-secret"; // first, request access token using client id and secret - TokenInfo info = loginWithClientSecret(URI.create(tokenEndpointUri), null, null, clientId, clientSecret, true, null, null, true); + TokenInfo info = loginWithClientSecret(URI.create(tokenEndpointUri), null, null, clientId, clientSecret, true, null, null, true, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); Map oauthConfig = new HashMap<>(); oauthConfig.put(ClientConfig.OAUTH_ACCESS_TOKEN, info.token()); diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/AuthorizationEndpointsTest.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/AuthorizationEndpointsTest.java index 8a17979b..c0cb8be2 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/AuthorizationEndpointsTest.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/AuthorizationEndpointsTest.java @@ -27,6 +27,7 @@ import java.util.Map; import static io.strimzi.kafka.oauth.common.IOUtil.randomHexString; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.common.TestUtil.getRootCause; import static io.strimzi.testsuite.oauth.mockoauth.Common.changeAuthServerMode; import static io.strimzi.testsuite.oauth.mockoauth.Common.createOAuthClient; @@ -67,7 +68,8 @@ public void doTest() throws Exception { true, null, null, - true); + true, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); OAuthBearerValidatorCallback[] oauthCallbacks = {new OAuthBearerValidatorCallback(tokenInfo.token())}; diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/ClientAssertionAuthTest.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/ClientAssertionAuthTest.java index f0c5ebb5..e7d3091f 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/ClientAssertionAuthTest.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/ClientAssertionAuthTest.java @@ -18,6 +18,7 @@ import javax.net.ssl.SSLSocketFactory; import java.net.URI; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.mockoauth.Common.WWW_FORM_CONTENT_TYPE; import static io.strimzi.testsuite.oauth.mockoauth.Common.changeAuthServerMode; import static io.strimzi.testsuite.oauth.mockoauth.Common.createOAuthClient; @@ -59,7 +60,8 @@ public void doTest() throws Exception { true, null, null, - null); + null, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); Assert.fail("Should have failed with 401"); } catch (Exception e) { @@ -79,7 +81,8 @@ public void doTest() throws Exception { true, null, null, - null); + null, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); String token = tokenInfo.token(); Assert.assertNotNull(token); diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/Common.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/Common.java index 8b794ff5..cc851bbd 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/Common.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/Common.java @@ -32,6 +32,7 @@ import java.util.Properties; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.base64encode; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; public class Common { @@ -112,7 +113,8 @@ static String loginWithClientSecret(String tokenEndpoint, String clientId, Strin new PrincipalExtractor(), "all", null, - true); + true, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); return tokenInfo.token(); } diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JWKSKeyUseTest.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JWKSKeyUseTest.java index 0f46e738..1d07287c 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JWKSKeyUseTest.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JWKSKeyUseTest.java @@ -20,6 +20,7 @@ import java.net.URI; import java.util.Collections; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.mockoauth.Common.changeAuthServerMode; import static io.strimzi.testsuite.oauth.mockoauth.Common.createOAuthClient; import static io.strimzi.testsuite.oauth.mockoauth.Common.getProjectRoot; @@ -54,7 +55,8 @@ public void doTest() throws Exception { null, null, null, - true); + true, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); TokenIntrospection.debugLogJWT(log, tokenInfo.token()); diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/PasswordAuthAndPrincipalExtractionTest.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/PasswordAuthAndPrincipalExtractionTest.java index 57981fc7..fd858d43 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/PasswordAuthAndPrincipalExtractionTest.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/PasswordAuthAndPrincipalExtractionTest.java @@ -23,6 +23,7 @@ import java.net.URI; import java.text.ParseException; +import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.mockoauth.Common.WWW_FORM_CONTENT_TYPE; import static io.strimzi.testsuite.oauth.mockoauth.Common.changeAuthServerMode; import static io.strimzi.testsuite.oauth.mockoauth.Common.createOAuthClient; @@ -132,7 +133,8 @@ public void doTest() throws Exception { null, null, null, - true); + true, + OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); token = tokenInfo.token(); Assert.assertNotNull(token); From 3e28e480168b1c9405f6315abef3601800351a95 Mon Sep 17 00:00:00 2001 From: George Jahad Date: Fri, 18 Apr 2025 12:19:25 -0700 Subject: [PATCH 2/5] fixed Config Signed-off-by: George Jahad --- .../io/strimzi/testsuite/oauth/HydraAuthenticationTest.java | 2 +- .../test/java/io/strimzi/testsuite/oauth/auth/BasicTests.java | 2 +- .../io/strimzi/testsuite/oauth/auth/JwtManipulationTests.java | 2 +- .../io/strimzi/testsuite/oauth/auth/OAuthOverPlainTests.java | 2 +- .../src/test/java/io/strimzi/testsuite/oauth/authz/Common.java | 2 +- .../test/java/io/strimzi/testsuite/oauth/authz/FloodTest.java | 2 +- .../io/strimzi/testsuite/oauth/auth/ErrorReportingTests.java | 2 +- .../testsuite/oauth/mockoauth/AuthorizationEndpointsTest.java | 2 +- .../testsuite/oauth/mockoauth/ClientAssertionAuthTest.java | 2 +- .../test/java/io/strimzi/testsuite/oauth/mockoauth/Common.java | 2 +- .../io/strimzi/testsuite/oauth/mockoauth/JWKSKeyUseTest.java | 2 +- .../oauth/mockoauth/PasswordAuthAndPrincipalExtractionTest.java | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/testsuite/hydra-test/src/test/java/io/strimzi/testsuite/oauth/HydraAuthenticationTest.java b/testsuite/hydra-test/src/test/java/io/strimzi/testsuite/oauth/HydraAuthenticationTest.java index 985c04e7..a59d6b12 100644 --- a/testsuite/hydra-test/src/test/java/io/strimzi/testsuite/oauth/HydraAuthenticationTest.java +++ b/testsuite/hydra-test/src/test/java/io/strimzi/testsuite/oauth/HydraAuthenticationTest.java @@ -42,7 +42,7 @@ import java.util.Map; import java.util.Properties; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.common.TestUtil.logStart; /** diff --git a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/BasicTests.java b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/BasicTests.java index 6e1a2fe8..8f9b1e00 100644 --- a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/BasicTests.java +++ b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/BasicTests.java @@ -28,7 +28,7 @@ import java.util.Properties; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.loginWithClientSecret; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.kafka.oauth.common.TokenIntrospection.introspectAccessToken; import static io.strimzi.testsuite.oauth.auth.Common.buildConsumerConfigOAuthBearer; import static io.strimzi.testsuite.oauth.auth.Common.buildProducerConfigOAuthBearer; diff --git a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/JwtManipulationTests.java b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/JwtManipulationTests.java index 0a7cb608..cd0fff8b 100644 --- a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/JwtManipulationTests.java +++ b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/JwtManipulationTests.java @@ -40,7 +40,7 @@ import static io.strimzi.testsuite.oauth.auth.Common.buildProducerConfigOAuthBearer; import static io.strimzi.testsuite.oauth.auth.Common.loginWithUsernamePassword; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; public class JwtManipulationTests { diff --git a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/OAuthOverPlainTests.java b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/OAuthOverPlainTests.java index a81bd8e0..35548ef1 100644 --- a/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/OAuthOverPlainTests.java +++ b/testsuite/keycloak-auth-tests/src/test/java/io/strimzi/testsuite/oauth/auth/OAuthOverPlainTests.java @@ -27,7 +27,7 @@ import java.util.concurrent.ExecutionException; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.loginWithClientSecret; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.auth.Common.buildConsumerConfigPlain; import static io.strimzi.testsuite.oauth.auth.Common.buildProducerConfigPlain; import static io.strimzi.testsuite.oauth.auth.Common.poll; diff --git a/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/Common.java b/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/Common.java index a67e5a9e..87723c1b 100644 --- a/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/Common.java +++ b/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/Common.java @@ -44,7 +44,7 @@ import java.util.concurrent.ExecutionException; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.loginWithClientSecret; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.urlencode; @SuppressFBWarnings({"THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", "THROWS_METHOD_THROWS_RUNTIMEEXCEPTION", "RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT"}) diff --git a/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/FloodTest.java b/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/FloodTest.java index 11380fcc..7676a25e 100644 --- a/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/FloodTest.java +++ b/testsuite/keycloak-authz-kraft-tests/src/test/java/io/strimzi/testsuite/oauth/authz/FloodTest.java @@ -26,7 +26,7 @@ import java.util.concurrent.atomic.AtomicInteger; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.loginWithClientSecret; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; @SuppressFBWarnings({"THROWS_METHOD_THROWS_RUNTIMEEXCEPTION", "THROWS_METHOD_THROWS_CLAUSE_THROWABLE"}) public class FloodTest extends Common { diff --git a/testsuite/keycloak-errors-tests/src/test/java/io/strimzi/testsuite/oauth/auth/ErrorReportingTests.java b/testsuite/keycloak-errors-tests/src/test/java/io/strimzi/testsuite/oauth/auth/ErrorReportingTests.java index f4d1b5d6..c60d9af2 100644 --- a/testsuite/keycloak-errors-tests/src/test/java/io/strimzi/testsuite/oauth/auth/ErrorReportingTests.java +++ b/testsuite/keycloak-errors-tests/src/test/java/io/strimzi/testsuite/oauth/auth/ErrorReportingTests.java @@ -21,7 +21,7 @@ import java.util.concurrent.ExecutionException; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.loginWithClientSecret; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.auth.Common.buildProducerConfigOAuthBearer; import static io.strimzi.testsuite.oauth.auth.Common.buildProducerConfigPlain; import static io.strimzi.testsuite.oauth.common.TestUtil.assertTrueExtra; diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/AuthorizationEndpointsTest.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/AuthorizationEndpointsTest.java index c0cb8be2..91ec7d88 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/AuthorizationEndpointsTest.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/AuthorizationEndpointsTest.java @@ -27,7 +27,7 @@ import java.util.Map; import static io.strimzi.kafka.oauth.common.IOUtil.randomHexString; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.common.TestUtil.getRootCause; import static io.strimzi.testsuite.oauth.mockoauth.Common.changeAuthServerMode; import static io.strimzi.testsuite.oauth.mockoauth.Common.createOAuthClient; diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/ClientAssertionAuthTest.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/ClientAssertionAuthTest.java index e7d3091f..1cda7809 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/ClientAssertionAuthTest.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/ClientAssertionAuthTest.java @@ -18,7 +18,7 @@ import javax.net.ssl.SSLSocketFactory; import java.net.URI; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.mockoauth.Common.WWW_FORM_CONTENT_TYPE; import static io.strimzi.testsuite.oauth.mockoauth.Common.changeAuthServerMode; import static io.strimzi.testsuite.oauth.mockoauth.Common.createOAuthClient; diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/Common.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/Common.java index cc851bbd..5399c8d6 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/Common.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/Common.java @@ -32,7 +32,7 @@ import java.util.Properties; import static io.strimzi.kafka.oauth.common.OAuthAuthenticator.base64encode; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; public class Common { diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JWKSKeyUseTest.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JWKSKeyUseTest.java index 1d07287c..e708e06a 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JWKSKeyUseTest.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JWKSKeyUseTest.java @@ -20,7 +20,7 @@ import java.net.URI; import java.util.Collections; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.mockoauth.Common.changeAuthServerMode; import static io.strimzi.testsuite.oauth.mockoauth.Common.createOAuthClient; import static io.strimzi.testsuite.oauth.mockoauth.Common.getProjectRoot; diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/PasswordAuthAndPrincipalExtractionTest.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/PasswordAuthAndPrincipalExtractionTest.java index fd858d43..cceea519 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/PasswordAuthAndPrincipalExtractionTest.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/PasswordAuthAndPrincipalExtractionTest.java @@ -23,7 +23,7 @@ import java.net.URI; import java.text.ParseException; -import static io.strimzi.kafka.oauth.common.Common.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; +import static io.strimzi.kafka.oauth.common.Config.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK; import static io.strimzi.testsuite.oauth.mockoauth.Common.WWW_FORM_CONTENT_TYPE; import static io.strimzi.testsuite.oauth.mockoauth.Common.changeAuthServerMode; import static io.strimzi.testsuite.oauth.mockoauth.Common.createOAuthClient; From d2d07a522edb5cb6fd74f95b2c91645a1a2dc84c Mon Sep 17 00:00:00 2001 From: George Jahad Date: Mon, 21 Apr 2025 14:40:20 -0700 Subject: [PATCH 3/5] add jaas config test Signed-off-by: George Jahad --- .../JaasClientOauthLoginCallbackHandler.java | 1 + .../oauth/mockoauth/JaasClientConfigTest.java | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/oauth-client/src/main/java/io/strimzi/kafka/oauth/client/JaasClientOauthLoginCallbackHandler.java b/oauth-client/src/main/java/io/strimzi/kafka/oauth/client/JaasClientOauthLoginCallbackHandler.java index 8c741ba3..919950a8 100644 --- a/oauth-client/src/main/java/io/strimzi/kafka/oauth/client/JaasClientOauthLoginCallbackHandler.java +++ b/oauth-client/src/main/java/io/strimzi/kafka/oauth/client/JaasClientOauthLoginCallbackHandler.java @@ -210,6 +210,7 @@ public void configure(Map configs, String saslMechanism, List oauthConfig = new HashMap<>(); + oauthConfig.put(ClientConfig.OAUTH_TOKEN_ENDPOINT_URI, TOKEN_ENDPOINT_URI); + oauthConfig.put(ClientConfig.OAUTH_CLIENT_ID, testClient); + oauthConfig.put(ClientConfig.OAUTH_CLIENT_SECRET, testSecret); + oauthConfig.put(ClientConfig.OAUTH_SSL_TRUSTSTORE_LOCATION, "../docker/target/kafka/certs/ca-truststore.p12"); + oauthConfig.put(ClientConfig.OAUTH_SSL_TRUSTSTORE_PASSWORD, "changeit"); + + oauthConfig.put(ClientConfig.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE, "dummy-grant-type"); + try { + initJaasWithRetry(oauthConfig); + Assert.fail("Should have failed"); + + } catch (KafkaException e) { + assertLoginException(e); + } + + oauthConfig.put(ClientConfig.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE, ClientConfig.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); + + LogLineReader logReader = new LogLineReader(Common.LOG_PATH); + logReader.readNext(); + initJaasWithRetry(oauthConfig); + List lines = logReader.readNext(); + boolean found = checkLogForRegex(lines, "Login succeeded"); + Assert.assertTrue("Login succeeded", found); + + } + + /** * If signing keys have not yet been loaded by kafka broker, * keep trying for up to 10 attempts with 2 second pause. From fcedc049a8a30606746925a0efa79bbefd54b04a Mon Sep 17 00:00:00 2001 From: George Jahad Date: Mon, 21 Apr 2025 15:01:07 -0700 Subject: [PATCH 4/5] cleanup Signed-off-by: George Jahad --- .../io/strimzi/kafka/oauth/common/OAuthAuthenticator.java | 1 - .../testsuite/oauth/mockoauth/JaasClientConfigTest.java | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/oauth-common/src/main/java/io/strimzi/kafka/oauth/common/OAuthAuthenticator.java b/oauth-common/src/main/java/io/strimzi/kafka/oauth/common/OAuthAuthenticator.java index 9c3e9e2f..88c17abb 100644 --- a/oauth-common/src/main/java/io/strimzi/kafka/oauth/common/OAuthAuthenticator.java +++ b/oauth-common/src/main/java/io/strimzi/kafka/oauth/common/OAuthAuthenticator.java @@ -161,7 +161,6 @@ public static TokenInfo loginWithClientSecret(URI tokenEndpointUrl, SSLSocketFac } String authorization = "Basic " + base64encode(clientId + ':' + clientSecret); - log.info("gbjoauth"); StringBuilder body = new StringBuilder("grant_type=" + grantType); if (scope != null) { diff --git a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JaasClientConfigTest.java b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JaasClientConfigTest.java index 53048f87..2b594ea6 100644 --- a/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JaasClientConfigTest.java +++ b/testsuite/mockoauth-tests/src/test/java/io/strimzi/testsuite/oauth/mockoauth/JaasClientConfigTest.java @@ -148,7 +148,7 @@ private void testAllConfigOptions() throws IOException { "password", "p\\*\\*", "scope", "scope", "audience", "audience", - "grantType", "client_credentials", + "grantType", ClientConfig.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK, "isJwt", "false", "usernameClaim", "username-claim", "fallbackUsernameClaim", "fallback-username-claim", @@ -587,7 +587,9 @@ private void testInvalidGrantType() throws Exception { oauthConfig.put(ClientConfig.OAUTH_SSL_TRUSTSTORE_LOCATION, "../docker/target/kafka/certs/ca-truststore.p12"); oauthConfig.put(ClientConfig.OAUTH_SSL_TRUSTSTORE_PASSWORD, "changeit"); + // Confirm fails with invalid grant type oauthConfig.put(ClientConfig.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE, "dummy-grant-type"); + try { initJaasWithRetry(oauthConfig); Assert.fail("Should have failed"); @@ -596,6 +598,7 @@ private void testInvalidGrantType() throws Exception { assertLoginException(e); } + // Confirm succeeds with valid grant type oauthConfig.put(ClientConfig.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE, ClientConfig.OAUTH_CLIENT_CREDENTIALS_GRANT_TYPE_FALLBACK); LogLineReader logReader = new LogLineReader(Common.LOG_PATH); From 5551865fd8038ab438f1fcae97aaf43cc593a552 Mon Sep 17 00:00:00 2001 From: George Jahad Date: Wed, 23 Apr 2025 11:17:51 -0700 Subject: [PATCH 5/5] updated README Signed-off-by: George Jahad --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 06e5a2bd..7e3942bd 100644 --- a/README.md +++ b/README.md @@ -945,6 +945,10 @@ together with one of authentication options below. When client starts to establish the connection with the Kafka Broker it will first obtain an access token from the configured Token Endpoint, authenticating with the configured client ID and configured authentication option using client_credentials grant type. +If the OAuth2 server is using an alternative to the "grant_type=client_credentials" string, such as "grant_type=kubernetes", that is achieved by specifying the following: +- `oauth.client.credentials.grant.type` (e.g.: "kubernetes") + + ##### Option 1: Using a Client Secret Specify the client secret.