This is an automated email from the ASF dual-hosted git repository.
dimas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new fa472299f Embrace request-scoped TokenBroker (#3024)
fa472299f is described below
commit fa472299fdf86736822b5fb60c0cfe22633603ac
Author: Christopher Lambert <[email protected]>
AuthorDate: Wed Nov 12 15:20:10 2025 +0100
Embrace request-scoped TokenBroker (#3024)
* Embrace request-scoped TokenBroker
`TokenBroker` and `CallContext` are both request-scoped, so instead of
passing the former into the latter, we can do this via the
`TokenBrokerFactory` and thus simplify the `TokenBroker` interface.
---
.../service/auth/internal/broker/JWTBroker.java | 15 +++--
.../auth/internal/broker/RSAKeyPairJWTBroker.java | 4 +-
.../broker/RSAKeyPairJWTBrokerFactory.java | 36 +++++------
.../internal/broker/SymmetricKeyJWTBroker.java | 4 +-
.../broker/SymmetricKeyJWTBrokerFactory.java | 65 +++++++++----------
.../service/auth/internal/broker/TokenBroker.java | 3 -
.../auth/internal/broker/TokenBrokerFactory.java | 9 ++-
.../internal/service/DefaultOAuth2ApiService.java | 19 +-----
.../polaris/service/config/ServiceProducers.java | 7 +-
.../broker/JWTSymmetricKeyGeneratorTest.java | 4 +-
.../internal/broker/RSAKeyPairJWTBrokerTest.java | 4 +-
.../service/DefaultOAuth2ApiServiceTest.java | 74 ++++------------------
12 files changed, 91 insertions(+), 153 deletions(-)
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/JWTBroker.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/JWTBroker.java
index 71ea0d054..2779f5a58 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/JWTBroker.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/JWTBroker.java
@@ -49,10 +49,15 @@ public abstract class JWTBroker implements TokenBroker {
private static final String CLAIM_KEY_SCOPE = "scope";
private final PolarisMetaStoreManager metaStoreManager;
+ private final PolarisCallContext polarisCallContext;
private final int maxTokenGenerationInSeconds;
- JWTBroker(PolarisMetaStoreManager metaStoreManager, int
maxTokenGenerationInSeconds) {
+ JWTBroker(
+ PolarisMetaStoreManager metaStoreManager,
+ PolarisCallContext polarisCallContext,
+ int maxTokenGenerationInSeconds) {
this.metaStoreManager = metaStoreManager;
+ this.polarisCallContext = polarisCallContext;
this.maxTokenGenerationInSeconds = maxTokenGenerationInSeconds;
}
@@ -86,7 +91,6 @@ public abstract class JWTBroker implements TokenBroker {
String subjectToken,
String grantType,
String scope,
- PolarisCallContext polarisCallContext,
TokenType requestedTokenType) {
if (requestedTokenType != null &&
!TokenType.ACCESS_TOKEN.equals(requestedTokenType)) {
return TokenResponse.of(OAuthError.invalid_request);
@@ -125,7 +129,6 @@ public abstract class JWTBroker implements TokenBroker {
String clientSecret,
String grantType,
String scope,
- PolarisCallContext polarisCallContext,
TokenType requestedTokenType) {
// Initial sanity checks
TokenRequestValidator validator = new TokenRequestValidator();
@@ -135,8 +138,7 @@ public abstract class JWTBroker implements TokenBroker {
return TokenResponse.of(initialValidationResponse.get());
}
- Optional<PrincipalEntity> principal =
- findPrincipalEntity(clientId, clientSecret, polarisCallContext);
+ Optional<PrincipalEntity> principal = findPrincipalEntity(clientId,
clientSecret);
if (principal.isEmpty()) {
return TokenResponse.of(OAuthError.unauthorized_client);
}
@@ -176,8 +178,7 @@ public abstract class JWTBroker implements TokenBroker {
return scope == null || scope.isBlank() ?
DefaultAuthenticator.PRINCIPAL_ROLE_ALL : scope;
}
- private Optional<PrincipalEntity> findPrincipalEntity(
- String clientId, String clientSecret, PolarisCallContext
polarisCallContext) {
+ private Optional<PrincipalEntity> findPrincipalEntity(String clientId,
String clientSecret) {
// Validate the principal is present and secrets match
PrincipalSecretsResult principalSecrets =
metaStoreManager.loadPrincipalSecrets(polarisCallContext, clientId);
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBroker.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBroker.java
index a2d903f6e..f70623f02 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBroker.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBroker.java
@@ -21,6 +21,7 @@ package org.apache.polaris.service.auth.internal.broker;
import com.auth0.jwt.algorithms.Algorithm;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
+import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
/** Generates a JWT using a Public/Private RSA Key */
@@ -30,9 +31,10 @@ public class RSAKeyPairJWTBroker extends JWTBroker {
RSAKeyPairJWTBroker(
PolarisMetaStoreManager metaStoreManager,
+ PolarisCallContext polarisCallContext,
int maxTokenGenerationInSeconds,
KeyProvider keyProvider) {
- super(metaStoreManager, maxTokenGenerationInSeconds);
+ super(metaStoreManager, polarisCallContext, maxTokenGenerationInSeconds);
this.keyProvider = keyProvider;
}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBrokerFactory.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBrokerFactory.java
index 74b4f90ef..6a6c81bb0 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBrokerFactory.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBrokerFactory.java
@@ -25,8 +25,8 @@ import java.security.NoSuchAlgorithmException;
import java.time.Duration;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.context.RealmContext;
-import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
import org.apache.polaris.service.auth.AuthenticationConfiguration;
import org.apache.polaris.service.auth.AuthenticationRealmConfiguration;
@@ -36,38 +36,32 @@ import
org.apache.polaris.service.auth.AuthenticationRealmConfiguration.TokenBro
@Identifier("rsa-key-pair")
public class RSAKeyPairJWTBrokerFactory implements TokenBrokerFactory {
- private final MetaStoreManagerFactory metaStoreManagerFactory;
private final AuthenticationConfiguration authenticationConfiguration;
- private final ConcurrentMap<String, RSAKeyPairJWTBroker> tokenBrokers = new
ConcurrentHashMap<>();
+ private final ConcurrentMap<String, KeyProvider> keyProviders = new
ConcurrentHashMap<>();
@Inject
- public RSAKeyPairJWTBrokerFactory(
- MetaStoreManagerFactory metaStoreManagerFactory,
- AuthenticationConfiguration authenticationConfiguration) {
- this.metaStoreManagerFactory = metaStoreManagerFactory;
+ public RSAKeyPairJWTBrokerFactory(AuthenticationConfiguration
authenticationConfiguration) {
this.authenticationConfiguration = authenticationConfiguration;
}
@Override
- public TokenBroker apply(RealmContext realmContext) {
- return tokenBrokers.computeIfAbsent(
- realmContext.getRealmIdentifier(), k ->
createTokenBroker(realmContext));
- }
-
- private RSAKeyPairJWTBroker createTokenBroker(RealmContext realmContext) {
+ public TokenBroker create(
+ PolarisMetaStoreManager metaStoreManager, PolarisCallContext
polarisCallContext) {
+ RealmContext realmContext = polarisCallContext.getRealmContext();
AuthenticationRealmConfiguration config =
authenticationConfiguration.forRealm(realmContext);
Duration maxTokenGeneration = config.tokenBroker().maxTokenGeneration();
KeyProvider keyProvider =
- config
- .tokenBroker()
- .rsaKeyPair()
- .map(this::fileSystemKeyPair)
- .orElseGet(this::generateEphemeralKeyPair);
- PolarisMetaStoreManager metaStoreManager =
- metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
+ keyProviders.computeIfAbsent(
+ realmContext.getRealmIdentifier(),
+ k ->
+ config
+ .tokenBroker()
+ .rsaKeyPair()
+ .map(this::fileSystemKeyPair)
+ .orElseGet(this::generateEphemeralKeyPair));
return new RSAKeyPairJWTBroker(
- metaStoreManager, (int) maxTokenGeneration.toSeconds(), keyProvider);
+ metaStoreManager, polarisCallContext, (int)
maxTokenGeneration.toSeconds(), keyProvider);
}
private KeyProvider fileSystemKeyPair(RSAKeyPairConfiguration config) {
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/SymmetricKeyJWTBroker.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/SymmetricKeyJWTBroker.java
index 0ca456f26..98315fdd0 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/SymmetricKeyJWTBroker.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/SymmetricKeyJWTBroker.java
@@ -20,6 +20,7 @@ package org.apache.polaris.service.auth.internal.broker;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.function.Supplier;
+import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
/** Generates a JWT using a Symmetric Key. */
@@ -28,9 +29,10 @@ public class SymmetricKeyJWTBroker extends JWTBroker {
public SymmetricKeyJWTBroker(
PolarisMetaStoreManager metaStoreManager,
+ PolarisCallContext polarisCallContext,
int maxTokenGenerationInSeconds,
Supplier<String> secretSupplier) {
- super(metaStoreManager, maxTokenGenerationInSeconds);
+ super(metaStoreManager, polarisCallContext, maxTokenGenerationInSeconds);
this.secretSupplier = secretSupplier;
}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/SymmetricKeyJWTBrokerFactory.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/SymmetricKeyJWTBrokerFactory.java
index 302b32393..b8fb3176c 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/SymmetricKeyJWTBrokerFactory.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/SymmetricKeyJWTBrokerFactory.java
@@ -27,11 +27,13 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Duration;
+import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.Supplier;
+import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.context.RealmContext;
-import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
+import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
import org.apache.polaris.service.auth.AuthenticationConfiguration;
import org.apache.polaris.service.auth.AuthenticationRealmConfiguration;
import
org.apache.polaris.service.auth.AuthenticationRealmConfiguration.TokenBrokerConfiguration.SymmetricKeyConfiguration;
@@ -40,51 +42,46 @@ import
org.apache.polaris.service.auth.AuthenticationRealmConfiguration.TokenBro
@Identifier("symmetric-key")
public class SymmetricKeyJWTBrokerFactory implements TokenBrokerFactory {
- private final MetaStoreManagerFactory metaStoreManagerFactory;
private final AuthenticationConfiguration authenticationConfiguration;
- private final ConcurrentMap<String, SymmetricKeyJWTBroker> tokenBrokers =
- new ConcurrentHashMap<>();
+ private final ConcurrentMap<String, Supplier<String>> secretSuppliers = new
ConcurrentHashMap<>();
@Inject
- public SymmetricKeyJWTBrokerFactory(
- MetaStoreManagerFactory metaStoreManagerFactory,
- AuthenticationConfiguration authenticationConfiguration) {
- this.metaStoreManagerFactory = metaStoreManagerFactory;
+ public SymmetricKeyJWTBrokerFactory(AuthenticationConfiguration
authenticationConfiguration) {
this.authenticationConfiguration = authenticationConfiguration;
}
@Override
- public TokenBroker apply(RealmContext realmContext) {
- return tokenBrokers.computeIfAbsent(
- realmContext.getRealmIdentifier(), k ->
createTokenBroker(realmContext));
- }
-
- private SymmetricKeyJWTBroker createTokenBroker(RealmContext realmContext) {
+ public TokenBroker create(
+ PolarisMetaStoreManager metaStoreManager, PolarisCallContext
polarisCallContext) {
+ RealmContext realmContext = polarisCallContext.getRealmContext();
AuthenticationRealmConfiguration config =
authenticationConfiguration.forRealm(realmContext);
Duration maxTokenGeneration = config.tokenBroker().maxTokenGeneration();
- SymmetricKeyConfiguration symmetricKeyConfiguration =
- config
- .tokenBroker()
- .symmetricKey()
- .orElseThrow(() -> new IllegalStateException("Symmetric key
configuration is missing"));
- String secret = symmetricKeyConfiguration.secret().orElse(null);
- Path file = symmetricKeyConfiguration.file().orElse(null);
- checkState(secret != null || file != null, "Either file or secret must be
set");
- Supplier<String> secretSupplier = secret != null ? () -> secret :
readSecretFromDisk(file);
+ Supplier<String> secretSupplier =
+ secretSuppliers.computeIfAbsent(
+ realmContext.getRealmIdentifier(),
+ k -> {
+ SymmetricKeyConfiguration symmetricKeyConfiguration =
+ config
+ .tokenBroker()
+ .symmetricKey()
+ .orElseThrow(
+ () ->
+ new IllegalStateException("Symmetric key
configuration is missing"));
+ String secret = symmetricKeyConfiguration.secret().orElse(null);
+ Path file = symmetricKeyConfiguration.file().orElse(null);
+ checkState(secret != null || file != null, "Either file or
secret must be set");
+ return () -> Objects.requireNonNullElseGet(secret, () ->
readSecretFromDisk(file));
+ });
return new SymmetricKeyJWTBroker(
- metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext),
- (int) maxTokenGeneration.toSeconds(),
- secretSupplier);
+ metaStoreManager, polarisCallContext, (int)
maxTokenGeneration.toSeconds(), secretSupplier);
}
- private static Supplier<String> readSecretFromDisk(Path file) {
- return () -> {
- try {
- return Files.readString(file);
- } catch (IOException e) {
- throw new RuntimeException("Failed to read secret from file: " + file,
e);
- }
- };
+ private static String readSecretFromDisk(Path file) {
+ try {
+ return Files.readString(file);
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to read secret from file: " + file,
e);
+ }
}
}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/TokenBroker.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/TokenBroker.java
index e35561b07..50597b006 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/TokenBroker.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/TokenBroker.java
@@ -18,7 +18,6 @@
*/
package org.apache.polaris.service.auth.internal.broker;
-import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.service.auth.PolarisCredential;
import org.apache.polaris.service.types.TokenType;
@@ -39,7 +38,6 @@ public interface TokenBroker {
final String clientSecret,
final String grantType,
final String scope,
- PolarisCallContext polarisCallContext,
TokenType requestedTokenType);
/**
@@ -52,7 +50,6 @@ public interface TokenBroker {
String subjectToken,
final String grantType,
final String scope,
- PolarisCallContext polarisCallContext,
TokenType requestedTokenType);
/** Decodes and verifies the token, then returns the associated {@link
PolarisCredential}. */
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/TokenBrokerFactory.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/TokenBrokerFactory.java
index 52d8aa1b7..9d3226701 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/TokenBrokerFactory.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/broker/TokenBrokerFactory.java
@@ -18,11 +18,14 @@
*/
package org.apache.polaris.service.auth.internal.broker;
-import java.util.function.Function;
-import org.apache.polaris.core.context.RealmContext;
+import org.apache.polaris.core.PolarisCallContext;
+import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
/**
* Factory that creates a {@link TokenBroker} for generating and parsing. The
{@link TokenBroker} is
* created based on the realm context.
*/
-public interface TokenBrokerFactory extends Function<RealmContext,
TokenBroker> {}
+public interface TokenBrokerFactory {
+ TokenBroker create(
+ PolarisMetaStoreManager metaStoreManager, PolarisCallContext
polarisCallContext);
+}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/service/DefaultOAuth2ApiService.java
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/service/DefaultOAuth2ApiService.java
index e02f93888..8400bd327 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/service/DefaultOAuth2ApiService.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/auth/internal/service/DefaultOAuth2ApiService.java
@@ -27,7 +27,6 @@ import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
import java.util.Base64;
import org.apache.iceberg.rest.responses.OAuthTokenResponse;
-import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.service.auth.internal.broker.TokenBroker;
import org.apache.polaris.service.auth.internal.broker.TokenResponse;
@@ -49,12 +48,10 @@ public class DefaultOAuth2ApiService implements
IcebergRestOAuth2ApiService {
private static final String BEARER = "bearer";
private final TokenBroker tokenBroker;
- private final CallContext callContext;
@Inject
- public DefaultOAuth2ApiService(TokenBroker tokenBroker, CallContext
callContext) {
+ public DefaultOAuth2ApiService(TokenBroker tokenBroker) {
this.tokenBroker = tokenBroker;
- this.callContext = callContext;
}
@Override
@@ -104,21 +101,11 @@ public class DefaultOAuth2ApiService implements
IcebergRestOAuth2ApiService {
if (clientSecret != null) {
tokenResponse =
tokenBroker.generateFromClientSecrets(
- clientId,
- clientSecret,
- grantType,
- scope,
- callContext.getPolarisCallContext(),
- requestedTokenType);
+ clientId, clientSecret, grantType, scope, requestedTokenType);
} else if (subjectToken != null) {
tokenResponse =
tokenBroker.generateFromToken(
- subjectTokenType,
- subjectToken,
- grantType,
- scope,
- callContext.getPolarisCallContext(),
- requestedTokenType);
+ subjectTokenType, subjectToken, grantType, scope,
requestedTokenType);
} else {
return OAuthUtils.getResponseFromError(OAuthError.invalid_request);
}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java
b/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java
index 13768f2ba..080cbc5ba 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java
@@ -398,13 +398,14 @@ public class ServiceProducers {
@RequestScoped
public TokenBroker tokenBroker(
AuthenticationRealmConfiguration config,
- RealmContext realmContext,
- @Any Instance<TokenBrokerFactory> tokenBrokerFactories) {
+ @Any Instance<TokenBrokerFactory> tokenBrokerFactories,
+ PolarisMetaStoreManager polarisMetaStoreManager,
+ CallContext callContext) {
String type =
config.type() == AuthenticationType.EXTERNAL ? "none" :
config.tokenBroker().type();
TokenBrokerFactory tokenBrokerFactory =
tokenBrokerFactories.select(Identifier.Literal.of(type)).get();
- return tokenBrokerFactory.apply(realmContext);
+ return tokenBrokerFactory.create(polarisMetaStoreManager,
callContext.getPolarisCallContext());
}
// other beans
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/broker/JWTSymmetricKeyGeneratorTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/broker/JWTSymmetricKeyGeneratorTest.java
index 651fc1a9d..058542d35 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/broker/JWTSymmetricKeyGeneratorTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/broker/JWTSymmetricKeyGeneratorTest.java
@@ -52,14 +52,14 @@ public class JWTSymmetricKeyGeneratorTest {
new
PrincipalEntity.Builder().setId(principalId).setName("principal").build();
Mockito.when(metastoreManager.findPrincipalById(polarisCallContext,
principalId))
.thenReturn(Optional.of(principal));
- TokenBroker generator = new SymmetricKeyJWTBroker(metastoreManager, 666,
() -> "polaris");
+ TokenBroker generator =
+ new SymmetricKeyJWTBroker(metastoreManager, polarisCallContext, 666,
() -> "polaris");
TokenResponse token =
generator.generateFromClientSecrets(
clientId,
mainSecret,
TokenRequestValidator.CLIENT_CREDENTIALS,
"PRINCIPAL_ROLE:TEST",
- polarisCallContext,
TokenType.ACCESS_TOKEN);
assertThat(token).isNotNull();
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBrokerTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBrokerTest.java
index 13bd7f3df..32d45c1ee 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBrokerTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/broker/RSAKeyPairJWTBrokerTest.java
@@ -64,14 +64,14 @@ public class RSAKeyPairJWTBrokerTest {
Mockito.when(metastoreManager.findPrincipalById(polarisCallContext,
principalId))
.thenReturn(Optional.of(principal));
KeyProvider provider = new LocalRSAKeyProvider(keyPair);
- TokenBroker tokenBroker = new RSAKeyPairJWTBroker(metastoreManager, 420,
provider);
+ TokenBroker tokenBroker =
+ new RSAKeyPairJWTBroker(metastoreManager, polarisCallContext, 420,
provider);
TokenResponse token =
tokenBroker.generateFromClientSecrets(
clientId,
mainSecret,
TokenRequestValidator.CLIENT_CREDENTIALS,
scope,
- polarisCallContext,
TokenType.ACCESS_TOKEN);
assertThat(token).isNotNull();
assertThat(token.getExpiresIn()).isEqualTo(420);
diff --git
a/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/service/DefaultOAuth2ApiServiceTest.java
b/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/service/DefaultOAuth2ApiServiceTest.java
index 14bcc45bb..f8dff0269 100644
---
a/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/service/DefaultOAuth2ApiServiceTest.java
+++
b/runtime/service/src/test/java/org/apache/polaris/service/auth/internal/service/DefaultOAuth2ApiServiceTest.java
@@ -24,15 +24,12 @@ import jakarta.ws.rs.core.Response;
import java.nio.charset.Charset;
import java.util.Base64;
import org.apache.iceberg.rest.responses.OAuthTokenResponse;
-import org.apache.polaris.core.PolarisCallContext;
-import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.service.auth.internal.broker.TokenBroker;
import org.apache.polaris.service.auth.internal.broker.TokenResponse;
import org.apache.polaris.service.types.TokenType;
import org.assertj.core.api.Assertions;
import org.assertj.core.api.InstanceOfAssertFactories;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
@@ -41,14 +38,6 @@ class DefaultOAuth2ApiServiceTest {
private static final String CLIENT_CREDENTIALS = "client_credentials";
private static final String TOKEN_EXCHANGE =
"urn:ietf:params:oauth:grant-type:token-exchange";
- private CallContext callContext;
-
- @BeforeEach
- void setUp() {
- callContext = Mockito.mock(CallContext.class);
-
when(callContext.getPolarisCallContext()).thenReturn(Mockito.mock(PolarisCallContext.class));
- }
-
@Test
public void testNoSupportGrantType() {
RealmContext realmContext = () -> "realm";
@@ -56,12 +45,7 @@ class DefaultOAuth2ApiServiceTest {
when(tokenBroker.supportsGrantType(CLIENT_CREDENTIALS)).thenReturn(false);
when(tokenBroker.supportsRequestedTokenType(TokenType.ACCESS_TOKEN)).thenReturn(true);
when(tokenBroker.generateFromClientSecrets(
- "client",
- "secret",
- CLIENT_CREDENTIALS,
- "scope",
- callContext.getPolarisCallContext(),
- TokenType.ACCESS_TOKEN))
+ "client", "secret", CLIENT_CREDENTIALS, "scope",
TokenType.ACCESS_TOKEN))
.thenReturn(TokenResponse.of("token",
TokenType.ACCESS_TOKEN.getValue(), 3600));
Response response =
new InvocationBuilder()
@@ -71,7 +55,7 @@ class DefaultOAuth2ApiServiceTest {
.grantType(CLIENT_CREDENTIALS)
.requestedTokenType(TokenType.ACCESS_TOKEN)
.realmContext(realmContext)
- .invoke(new DefaultOAuth2ApiService(tokenBroker, callContext));
+ .invoke(new DefaultOAuth2ApiService(tokenBroker));
Assertions.assertThat(response.getEntity())
.isInstanceOf(OAuthTokenErrorResponse.class)
.asInstanceOf(InstanceOfAssertFactories.type(OAuthTokenErrorResponse.class))
@@ -85,12 +69,7 @@ class DefaultOAuth2ApiServiceTest {
when(tokenBroker.supportsGrantType(CLIENT_CREDENTIALS)).thenReturn(true);
when(tokenBroker.supportsRequestedTokenType(TokenType.ACCESS_TOKEN)).thenReturn(false);
when(tokenBroker.generateFromClientSecrets(
- "client",
- "secret",
- CLIENT_CREDENTIALS,
- "scope",
- callContext.getPolarisCallContext(),
- TokenType.ACCESS_TOKEN))
+ "client", "secret", CLIENT_CREDENTIALS, "scope",
TokenType.ACCESS_TOKEN))
.thenReturn(TokenResponse.of("token",
TokenType.ACCESS_TOKEN.getValue(), 3600));
Response response =
new InvocationBuilder()
@@ -100,7 +79,7 @@ class DefaultOAuth2ApiServiceTest {
.grantType(CLIENT_CREDENTIALS)
.requestedTokenType(TokenType.ACCESS_TOKEN)
.realmContext(realmContext)
- .invoke(new DefaultOAuth2ApiService(tokenBroker, callContext));
+ .invoke(new DefaultOAuth2ApiService(tokenBroker));
Assertions.assertThat(response.getEntity())
.isInstanceOf(OAuthTokenErrorResponse.class)
.asInstanceOf(InstanceOfAssertFactories.type(OAuthTokenErrorResponse.class))
@@ -114,12 +93,7 @@ class DefaultOAuth2ApiServiceTest {
when(tokenBroker.supportsGrantType(CLIENT_CREDENTIALS)).thenReturn(true);
when(tokenBroker.supportsRequestedTokenType(TokenType.ACCESS_TOKEN)).thenReturn(true);
when(tokenBroker.generateFromClientSecrets(
- null,
- "secret",
- CLIENT_CREDENTIALS,
- "scope",
- callContext.getPolarisCallContext(),
- TokenType.ACCESS_TOKEN))
+ null, "secret", CLIENT_CREDENTIALS, "scope",
TokenType.ACCESS_TOKEN))
.thenReturn(TokenResponse.of("token",
TokenType.ACCESS_TOKEN.getValue(), 3600));
Response response =
new InvocationBuilder()
@@ -128,7 +102,7 @@ class DefaultOAuth2ApiServiceTest {
.grantType(CLIENT_CREDENTIALS)
.requestedTokenType(TokenType.ACCESS_TOKEN)
.realmContext(realmContext)
- .invoke(new DefaultOAuth2ApiService(tokenBroker, callContext));
+ .invoke(new DefaultOAuth2ApiService(tokenBroker));
Assertions.assertThat(response.getEntity())
.isInstanceOf(OAuthTokenResponse.class)
.asInstanceOf(InstanceOfAssertFactories.type(OAuthTokenResponse.class))
@@ -142,12 +116,7 @@ class DefaultOAuth2ApiServiceTest {
when(tokenBroker.supportsGrantType(CLIENT_CREDENTIALS)).thenReturn(true);
when(tokenBroker.supportsRequestedTokenType(TokenType.ACCESS_TOKEN)).thenReturn(true);
when(tokenBroker.generateFromClientSecrets(
- "client",
- "secret",
- CLIENT_CREDENTIALS,
- "scope",
- callContext.getPolarisCallContext(),
- TokenType.ACCESS_TOKEN))
+ "client", "secret", CLIENT_CREDENTIALS, "scope",
TokenType.ACCESS_TOKEN))
.thenReturn(TokenResponse.of("token",
TokenType.ACCESS_TOKEN.getValue(), 3600));
Response response =
new InvocationBuilder()
@@ -157,7 +126,7 @@ class DefaultOAuth2ApiServiceTest {
.grantType(CLIENT_CREDENTIALS)
.requestedTokenType(TokenType.ACCESS_TOKEN)
.realmContext(realmContext)
- .invoke(new DefaultOAuth2ApiService(tokenBroker, callContext));
+ .invoke(new DefaultOAuth2ApiService(tokenBroker));
Assertions.assertThat(response.getEntity())
.isInstanceOf(OAuthTokenResponse.class)
.asInstanceOf(InstanceOfAssertFactories.type(OAuthTokenResponse.class))
@@ -171,12 +140,7 @@ class DefaultOAuth2ApiServiceTest {
when(tokenBroker.supportsGrantType(TOKEN_EXCHANGE)).thenReturn(true);
when(tokenBroker.supportsRequestedTokenType(TokenType.ACCESS_TOKEN)).thenReturn(true);
when(tokenBroker.generateFromClientSecrets(
- "client",
- "secret",
- TOKEN_EXCHANGE,
- "scope",
- callContext.getPolarisCallContext(),
- TokenType.ACCESS_TOKEN))
+ "client", "secret", TOKEN_EXCHANGE, "scope",
TokenType.ACCESS_TOKEN))
.thenReturn(TokenResponse.of("token",
TokenType.ACCESS_TOKEN.getValue(), 3600));
Response response =
new InvocationBuilder()
@@ -188,7 +152,7 @@ class DefaultOAuth2ApiServiceTest {
.grantType(TOKEN_EXCHANGE)
.requestedTokenType(TokenType.ACCESS_TOKEN)
.realmContext(realmContext)
- .invoke(new DefaultOAuth2ApiService(tokenBroker, callContext));
+ .invoke(new DefaultOAuth2ApiService(tokenBroker));
Assertions.assertThat(response.getEntity())
.isInstanceOf(OAuthTokenResponse.class)
.asInstanceOf(InstanceOfAssertFactories.type(OAuthTokenResponse.class))
@@ -202,12 +166,7 @@ class DefaultOAuth2ApiServiceTest {
when(tokenBroker.supportsGrantType(TOKEN_EXCHANGE)).thenReturn(true);
when(tokenBroker.supportsRequestedTokenType(TokenType.ACCESS_TOKEN)).thenReturn(true);
when(tokenBroker.generateFromClientSecrets(
- null,
- "secret",
- TOKEN_EXCHANGE,
- "scope",
- callContext.getPolarisCallContext(),
- TokenType.ACCESS_TOKEN))
+ null, "secret", TOKEN_EXCHANGE, "scope", TokenType.ACCESS_TOKEN))
.thenReturn(TokenResponse.of("token",
TokenType.ACCESS_TOKEN.getValue(), 3600));
Response response =
new InvocationBuilder()
@@ -219,7 +178,7 @@ class DefaultOAuth2ApiServiceTest {
.grantType(TOKEN_EXCHANGE)
.requestedTokenType(TokenType.ACCESS_TOKEN)
.realmContext(realmContext)
- .invoke(new DefaultOAuth2ApiService(tokenBroker, callContext));
+ .invoke(new DefaultOAuth2ApiService(tokenBroker));
Assertions.assertThat(response.getEntity())
.isInstanceOf(OAuthTokenErrorResponse.class)
.asInstanceOf(InstanceOfAssertFactories.type(OAuthTokenErrorResponse.class))
@@ -234,12 +193,7 @@ class DefaultOAuth2ApiServiceTest {
when(tokenBroker.supportsRequestedTokenType(TokenType.ACCESS_TOKEN)).thenReturn(true);
when(tokenBroker.generateFromClientSecrets(
- "",
- "secret",
- TOKEN_EXCHANGE,
- "scope",
- callContext.getPolarisCallContext(),
- TokenType.ACCESS_TOKEN))
+ "", "secret", TOKEN_EXCHANGE, "scope", TokenType.ACCESS_TOKEN))
.thenReturn(TokenResponse.of("token",
TokenType.ACCESS_TOKEN.getValue(), 3600));
Response response =
new InvocationBuilder()
@@ -253,7 +207,7 @@ class DefaultOAuth2ApiServiceTest {
.grantType(TOKEN_EXCHANGE)
.requestedTokenType(TokenType.ACCESS_TOKEN)
.realmContext(realmContext)
- .invoke(new DefaultOAuth2ApiService(tokenBroker, callContext));
+ .invoke(new DefaultOAuth2ApiService(tokenBroker));
Assertions.assertThat(response.getEntity())
.isInstanceOf(OAuthTokenResponse.class)
.asInstanceOf(InstanceOfAssertFactories.type(OAuthTokenResponse.class))