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

jshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 873757f1eb [#8087] improvement(Oauth2): OAuth2 token provider to 
automatically fetch a new token (#8116)
873757f1eb is described below

commit 873757f1ebb45ce3ab8afb51fe2fb702282c6e61
Author: Sambhavi Pandey <[email protected]>
AuthorDate: Tue Aug 19 09:38:52 2025 +0530

    [#8087] improvement(Oauth2): OAuth2 token provider to automatically fetch a 
new token (#8116)
    
    ### What changes were proposed in this pull request?
    Oauth2 provider automatically fetches a new token when the old one is
    expired
    
    
    ### Why are the changes needed?
    Improve the Oauth2 token provider to fetch auth token automatically
    
    Fix: #8087
    
    ### Does this PR introduce _any_ user-facing change?
    
    ### How was this patch tested?
    Unit testing
---
 .../client/DefaultOAuth2TokenProvider.java         | 14 +++------
 .../gravitino/client/TestOAuth2TokenProvider.java  | 35 ++++++++++++++++++++--
 2 files changed, 37 insertions(+), 12 deletions(-)

diff --git 
a/clients/client-java/src/main/java/org/apache/gravitino/client/DefaultOAuth2TokenProvider.java
 
b/clients/client-java/src/main/java/org/apache/gravitino/client/DefaultOAuth2TokenProvider.java
index 59e901eee7..7d2e5fb870 100644
--- 
a/clients/client-java/src/main/java/org/apache/gravitino/client/DefaultOAuth2TokenProvider.java
+++ 
b/clients/client-java/src/main/java/org/apache/gravitino/client/DefaultOAuth2TokenProvider.java
@@ -36,17 +36,11 @@ public class DefaultOAuth2TokenProvider extends 
OAuth2TokenProvider {
   protected String getAccessToken() {
     synchronized (this) {
       Long expires = OAuth2ClientUtil.expiresAtMillis(token);
-      if (expires == null) {
-        return null;
+      if (expires == null || expires <= System.currentTimeMillis()) {
+        token =
+            OAuth2ClientUtil.fetchToken(client, Collections.emptyMap(), 
credential, scope, path)
+                .getAccessToken();
       }
-
-      if (expires > System.currentTimeMillis()) {
-        return token;
-      }
-
-      token =
-          OAuth2ClientUtil.fetchToken(client, Collections.emptyMap(), 
credential, scope, path)
-              .getAccessToken();
       return token;
     }
   }
diff --git 
a/clients/client-java/src/test/java/org/apache/gravitino/client/TestOAuth2TokenProvider.java
 
b/clients/client-java/src/test/java/org/apache/gravitino/client/TestOAuth2TokenProvider.java
index 426078c62b..2c91f17e38 100644
--- 
a/clients/client-java/src/test/java/org/apache/gravitino/client/TestOAuth2TokenProvider.java
+++ 
b/clients/client-java/src/test/java/org/apache/gravitino/client/TestOAuth2TokenProvider.java
@@ -118,10 +118,10 @@ public class TestOAuth2TokenProvider {
     response = new OAuth2TokenResponse("1", "2", "bearer", 1, "test", null);
     respJson = objectMapper.writeValueAsString(response);
     mockResponse = mockResponse.withBody(respJson);
-    mockServer.when(any(), Times.exactly(1)).respond(mockResponse);
+    mockServer.when(any(), Times.exactly(2)).respond(mockResponse);
     OAuth2TokenProvider provider = builder.build();
     Assertions.assertTrue(provider.hasTokenData());
-    Assertions.assertNull(provider.getTokenData());
+    Assertions.assertNotNull(provider.getTokenData());
     KeyPair keyPair = Keys.keyPairFor(SignatureAlgorithm.RS256);
     String oldAccessToken =
         Jwts.builder()
@@ -153,4 +153,35 @@ public class TestOAuth2TokenProvider {
         AuthConstants.AUTHORIZATION_BEARER_HEADER + accessToken,
         new String(provider.getTokenData(), StandardCharsets.UTF_8));
   }
+
+  @Test
+  public void testTokenNotFetchedWhenValid() throws Exception {
+    OAuth2TokenProvider.Builder builder =
+        DefaultOAuth2TokenProvider.builder()
+            .withUri(String.format("http://127.0.0.1:%d";, PORT))
+            .withCredential("yy:xx")
+            .withPath("oauth/token")
+            .withScope("test");
+    HttpResponse mockResponse = 
HttpResponse.response().withStatusCode(HttpStatus.SC_OK);
+    ObjectMapper objectMapper = ObjectMapperProvider.objectMapper();
+    KeyPair keyPair = Keys.keyPairFor(SignatureAlgorithm.RS256);
+    String accessToken =
+        Jwts.builder()
+            .setSubject("gravitino")
+            .setExpiration(new Date(System.currentTimeMillis() + 10000))
+            .setAudience("service1")
+            .signWith(keyPair.getPrivate(), SignatureAlgorithm.RS256)
+            .compact();
+
+    OAuth2TokenResponse response =
+        new OAuth2TokenResponse(accessToken, "2", "bearer", 1, "test", null);
+    String respJson = objectMapper.writeValueAsString(response);
+    mockResponse = mockResponse.withBody(respJson);
+    mockServer.when(any(), Times.exactly(1)).respond(mockResponse);
+    OAuth2TokenProvider provider = builder.build();
+    String token = provider.getAccessToken();
+    Assertions.assertEquals(accessToken, token);
+    String oldToken = provider.getAccessToken();
+    Assertions.assertEquals(accessToken, oldToken);
+  }
 }

Reply via email to