This is an automated email from the ASF dual-hosted git repository.

roryqi pushed a commit to branch branch-1.1
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-1.1 by this push:
     new 73847f4a7c [#9713] fix(oauth): Allow JWKS validators without serverUri 
or tokenPath (#9732)
73847f4a7c is described below

commit 73847f4a7cb5307e30879bf8e205c4d197f5711e
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Jan 16 15:25:16 2026 +0800

    [#9713] fix(oauth): Allow JWKS validators without serverUri or tokenPath 
(#9732)
    
    ### What changes were proposed in this pull request?
    
    Allow JWKS validators without serverUri or tokenPath as these are only
    needed in Static validator
    
    ### Why are the changes needed?
    
    Earlier the validation was done in base class which was not correct, as
    some implementations don't need these configs.
    
    Fix: #9713
    
    ### Does this PR introduce _any_ user-facing change?
    
    No
    
    ### How was this patch tested?
    Added unit tests
    
    Co-authored-by: Bharath Krishna <[email protected]>
---
 docs/security/how-to-authenticate.md               |  4 ++--
 .../authentication/OAuth2TokenAuthenticator.java   |  8 -------
 .../server/authentication/OAuthConfig.java         |  6 +++--
 .../TestOAuth2TokenAuthenticator.java              | 26 ++++++++++++++++++----
 4 files changed, 28 insertions(+), 16 deletions(-)

diff --git a/docs/security/how-to-authenticate.md 
b/docs/security/how-to-authenticate.md
index 8834c330f7..ef5338cb5f 100644
--- a/docs/security/how-to-authenticate.md
+++ b/docs/security/how-to-authenticate.md
@@ -125,8 +125,8 @@ Gravitino server and Gravitino Iceberg REST server share 
the same configuration
 | `gravitino.authenticator.oauth.allowSkewSecs`       | The JWT allows skew 
seconds when Gravitino uses OAuth as the authenticator.                         
                                                                                
                                                                                
    | `0`                                                                 | No  
                                                                                
            | 0. [...]
 | `gravitino.authenticator.oauth.defaultSignKey`      | The signing key of JWT 
when Gravitino uses OAuth as the authenticator.                                 
                                                                                
                                                                                
 | (none)                                                              | Yes if 
use `oauth` as the authenticator                                                
         | 0. [...]
 | `gravitino.authenticator.oauth.signAlgorithmType`   | The signature 
algorithm when Gravitino uses OAuth as the authenticator.                       
                                                                                
                                                                                
          | `RS256`                                                             
| No                                                                            
                  | 0. [...]
-| `gravitino.authenticator.oauth.serverUri`           | The URI of the default 
OAuth server.                                                                   
                                                                                
                                                                                
 | (none)                                                              | Yes if 
use `oauth` as the authenticator                                                
         | 0. [...]
-| `gravitino.authenticator.oauth.tokenPath`           | The path for token of 
the default OAuth server.                                                       
                                                                                
                                                                                
  | (none)                                                              | Yes 
if use `oauth` as the authenticator                                             
            | 0. [...]
+| `gravitino.authenticator.oauth.serverUri`           | The URI of the default 
OAuth server. Required when using StaticSignKeyValidator, not required for 
JWKS-based validators.                                                          
                                                                                
      | (none)                                                              | 
Yes if using `StaticSignKeyValidator`                                           
                | 0. [...]
+| `gravitino.authenticator.oauth.tokenPath`           | The path for token of 
the default OAuth server. Required when using StaticSignKeyValidator, not 
required for JWKS-based validators.                                             
                                                                                
        | (none)                                                              | 
Yes if using `StaticSignKeyValidator`                                           
                | 0. [...]
 | `gravitino.authenticator.oauth.provider`            | OAuth provider type 
(default, oidc). Determines the Web UI authentication flow. Use 'oidc' for Web 
UI OIDC login, 'default' for legacy login or API-only authentication.           
                                                                                
     | `default`                                                           | No 
                                                                                
             | 1. [...]
 | `gravitino.authenticator.oauth.clientId`            | OAuth client ID for 
Web UI authentication.                                                          
                                                                                
                                                                                
    | (none)                                                              | Yes 
if provider is `oidc`                                                           
            | 1. [...]
 | `gravitino.authenticator.oauth.authority`           | OAuth authority/issuer 
URL for OIDC providers for web UI authentication. (e.g., Azure AD tenant URL).  
                                                                                
                                                                                
 | (none)                                                              | Yes if 
provider is `oidc`                                                              
         | 1. [...]
diff --git 
a/server-common/src/main/java/org/apache/gravitino/server/authentication/OAuth2TokenAuthenticator.java
 
b/server-common/src/main/java/org/apache/gravitino/server/authentication/OAuth2TokenAuthenticator.java
index 7f2821e411..4b1f3ff81f 100644
--- 
a/server-common/src/main/java/org/apache/gravitino/server/authentication/OAuth2TokenAuthenticator.java
+++ 
b/server-common/src/main/java/org/apache/gravitino/server/authentication/OAuth2TokenAuthenticator.java
@@ -49,14 +49,6 @@ class OAuth2TokenAuthenticator implements Authenticator {
         StringUtils.isNotBlank(serviceAudience),
         "Service audience cannot be blank for OAuth authentication");
 
-    Preconditions.checkArgument(
-        StringUtils.isNotBlank(config.get(OAuthConfig.DEFAULT_TOKEN_PATH)),
-        "The path for token of the default OAuth server can't be blank");
-    Preconditions.checkArgument(
-        StringUtils.isNotBlank(config.get(OAuthConfig.DEFAULT_SERVER_URI)),
-        "The uri of the default OAuth server can't be blank");
-
-    // Create the appropriate token validator based on configuration
     this.tokenValidator = OAuthTokenValidatorFactory.createValidator(config);
   }
 
diff --git 
a/server-common/src/main/java/org/apache/gravitino/server/authentication/OAuthConfig.java
 
b/server-common/src/main/java/org/apache/gravitino/server/authentication/OAuthConfig.java
index 4f7078bde5..5fd3613458 100644
--- 
a/server-common/src/main/java/org/apache/gravitino/server/authentication/OAuthConfig.java
+++ 
b/server-common/src/main/java/org/apache/gravitino/server/authentication/OAuthConfig.java
@@ -61,7 +61,8 @@ public interface OAuthConfig {
 
   ConfigEntry<String> DEFAULT_SERVER_URI =
       new ConfigBuilder(OAUTH_CONFIG_PREFIX + "serverUri")
-          .doc("The uri of the default OAuth server")
+          .doc(
+              "The uri of the default OAuth server. Required when using 
StaticSignKeyValidator, not required for JWKS-based validators")
           .version(ConfigConstants.VERSION_0_3_0)
           .stringConf()
           .checkValue(StringUtils::isNotBlank, 
ConfigConstants.NOT_BLANK_ERROR_MSG)
@@ -69,7 +70,8 @@ public interface OAuthConfig {
 
   ConfigEntry<String> DEFAULT_TOKEN_PATH =
       new ConfigBuilder(OAUTH_CONFIG_PREFIX + "tokenPath")
-          .doc("The path for token of the default OAuth server")
+          .doc(
+              "The path for token of the default OAuth server. Required when 
using StaticSignKeyValidator, not required for JWKS-based validators")
           .version(ConfigConstants.VERSION_0_3_0)
           .stringConf()
           .checkValue(StringUtils::isNotBlank, 
ConfigConstants.NOT_BLANK_ERROR_MSG)
diff --git 
a/server-common/src/test/java/org/apache/gravitino/server/authentication/TestOAuth2TokenAuthenticator.java
 
b/server-common/src/test/java/org/apache/gravitino/server/authentication/TestOAuth2TokenAuthenticator.java
index 080ceb439b..d6571df6bd 100644
--- 
a/server-common/src/test/java/org/apache/gravitino/server/authentication/TestOAuth2TokenAuthenticator.java
+++ 
b/server-common/src/test/java/org/apache/gravitino/server/authentication/TestOAuth2TokenAuthenticator.java
@@ -174,6 +174,27 @@ public class TestOAuth2TokenAuthenticator {
     assertThrows(IllegalArgumentException.class, () -> 
authenticator.initialize(config));
   }
 
+  @Test
+  public void testInitializeStaticKeyValidatorRequiresServerUriAndTokenPath() {
+    OAuth2TokenAuthenticator authenticator = new OAuth2TokenAuthenticator();
+    Config config = new Config(false) {};
+    config.set(OAuthConfig.SERVICE_AUDIENCE, "test-service");
+    Key tempKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
+    config.set(
+        OAuthConfig.DEFAULT_SIGN_KEY, 
Base64.getEncoder().encodeToString(tempKey.getEncoded()));
+    // Use default StaticSignKeyValidator which requires serverUri and 
tokenPath
+    config.set(
+        OAuthConfig.TOKEN_VALIDATOR_CLASS,
+        "org.apache.gravitino.server.authentication.StaticSignKeyValidator");
+
+    // Should fail when serverUri and tokenPath are missing for 
StaticSignKeyValidator
+    IllegalArgumentException e =
+        assertThrows(IllegalArgumentException.class, () -> 
authenticator.initialize(config));
+    assertTrue(
+        e.getMessage().contains("token") || e.getMessage().contains("uri"),
+        "Expected error message about token path or server URI, got: " + 
e.getMessage());
+  }
+
   @Test
   public void testInitializeWithJwksConfiguration() {
     OAuth2TokenAuthenticator authenticator = new OAuth2TokenAuthenticator();
@@ -183,13 +204,10 @@ public class TestOAuth2TokenAuthenticator {
     config.set(
         OAuthConfig.JWKS_URI, 
"https://login.microsoftonline.com/common/discovery/v2.0/keys";);
     config.set(OAuthConfig.AUTHORITY, "https://login.microsoftonline.com";);
-    config.set(OAuthConfig.DEFAULT_TOKEN_PATH, "/token");
-    config.set(OAuthConfig.DEFAULT_SERVER_URI, "http://localhost:8080";);
+    // Note: DEFAULT_TOKEN_PATH and DEFAULT_SERVER_URI are not required for 
JWKS validator
     config.set(
         OAuthConfig.TOKEN_VALIDATOR_CLASS,
         "org.apache.gravitino.server.authentication.JwksTokenValidator");
-
-    // Should initialize with JWKS validator
     authenticator.initialize(config);
     assertTrue(authenticator.isDataFromToken());
   }

Reply via email to