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

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


The following commit(s) were added to refs/heads/main by this push:
     new a954d2cb31 NIFI-15070 Fixed OAuth2AccessTokenProvider for Access 
Tokens without expiration (#10401)
a954d2cb31 is described below

commit a954d2cb317629086674f9a3ac0d7dfff0cffcc5
Author: Peter Turcsanyi <[email protected]>
AuthorDate: Tue Dec 2 03:53:41 2025 +0100

    NIFI-15070 Fixed OAuth2AccessTokenProvider for Access Tokens without 
expiration (#10401)
    
    - Added Default Expiration Time to StandardOauth2AccessTokenProvider
    
    Signed-off-by: David Handermann <[email protected]>
---
 .../main/java/org/apache/nifi/oauth2/AccessToken.java  | 18 +++++++++++-------
 .../java/org/apache/nifi/oauth2/AccessTokenTest.java   |  9 ++++++++-
 .../oauth2/JWTBearerOAuth2AccessTokenProvider.java     |  2 +-
 .../nifi/oauth2/StandardOauth2AccessTokenProvider.java | 17 +++++++++++++++--
 4 files changed, 35 insertions(+), 11 deletions(-)

diff --git 
a/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-api/src/main/java/org/apache/nifi/oauth2/AccessToken.java
 
b/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-api/src/main/java/org/apache/nifi/oauth2/AccessToken.java
index 1c26596797..4e1fbb546d 100644
--- 
a/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-api/src/main/java/org/apache/nifi/oauth2/AccessToken.java
+++ 
b/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-api/src/main/java/org/apache/nifi/oauth2/AccessToken.java
@@ -25,7 +25,7 @@ public class AccessToken {
     private String accessToken;
     private String refreshToken;
     private String tokenType;
-    private long expiresIn;
+    private Long expiresIn;
     private String scope;
 
     private final Instant fetchTime;
@@ -33,10 +33,10 @@ public class AccessToken {
     private final Map<String, Object> additionalParameters = new HashMap<>();
 
     public AccessToken() {
-        this.fetchTime = Instant.now();
+        this.fetchTime = now();
     }
 
-    public AccessToken(String accessToken, String refreshToken, String 
tokenType, long expiresIn, String scope) {
+    public AccessToken(String accessToken, String refreshToken, String 
tokenType, Long expiresIn, String scope) {
         this();
         this.accessToken = accessToken;
         this.refreshToken = refreshToken;
@@ -69,11 +69,11 @@ public class AccessToken {
         this.tokenType = tokenType;
     }
 
-    public long getExpiresIn() {
+    public Long getExpiresIn() {
         return expiresIn;
     }
 
-    public void setExpiresIn(long expiresIn) {
+    public void setExpiresIn(Long expiresIn) {
         this.expiresIn = expiresIn;
     }
 
@@ -90,8 +90,12 @@ public class AccessToken {
     }
 
     public boolean isExpired() {
-        final Instant expirationTime = fetchTime.plusSeconds(expiresIn);
-        return now().isAfter(expirationTime);
+        if (expiresIn == null) {
+            return false;
+        } else {
+            final Instant expirationTime = fetchTime.plusSeconds(expiresIn);
+            return now().isAfter(expirationTime);
+        }
     }
 
     Instant now() {
diff --git 
a/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-api/src/test/java/org/apache/nifi/oauth2/AccessTokenTest.java
 
b/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-api/src/test/java/org/apache/nifi/oauth2/AccessTokenTest.java
index 5312055f50..9be1e42ad2 100644
--- 
a/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-api/src/test/java/org/apache/nifi/oauth2/AccessTokenTest.java
+++ 
b/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-api/src/test/java/org/apache/nifi/oauth2/AccessTokenTest.java
@@ -50,7 +50,14 @@ public class AccessTokenTest {
         assertFalse(accessToken.isExpired());
     }
 
-    private AccessToken getAccessToken(final long expiresInSeconds) {
+    @Test
+    public void testIsExpiredNever() {
+        final AccessToken accessToken = getAccessToken(null);
+
+        assertFalse(accessToken.isExpired());
+    }
+
+    private AccessToken getAccessToken(final Long expiresInSeconds) {
         return new AccessToken(
                 null,
                 null,
diff --git 
a/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-bundle/nifi-oauth2-provider-service/src/main/java/org/apache/nifi/oauth2/JWTBearerOAuth2AccessTokenProvider.java
 
b/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-bundle/nifi-oauth2-provider-service/src/main/java/org/apache/nifi/oauth2/JWTBearerOAuth2AccessTokenProvider.java
index 28061cbbcc..d83a55e61d 100644
--- 
a/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-bundle/nifi-oauth2-provider-service/src/main/java/org/apache/nifi/oauth2/JWTBearerOAuth2AccessTokenProvider.java
+++ 
b/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-bundle/nifi-oauth2-provider-service/src/main/java/org/apache/nifi/oauth2/JWTBearerOAuth2AccessTokenProvider.java
@@ -429,7 +429,7 @@ public class JWTBearerOAuth2AccessTokenProvider extends 
AbstractControllerServic
     }
 
     private boolean isRefreshRequired() {
-        if (accessDetails.getExpiresIn() > 0) {
+        if (accessDetails.getExpiresIn() != null) {
             final Instant expirationRefreshTime = accessDetails.getFetchTime()
                     .plusSeconds(accessDetails.getExpiresIn())
                     .minus(refreshWindow);
diff --git 
a/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-bundle/nifi-oauth2-provider-service/src/main/java/org/apache/nifi/oauth2/StandardOauth2AccessTokenProvider.java
 
b/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-bundle/nifi-oauth2-provider-service/src/main/java/org/apache/nifi/oauth2/StandardOauth2AccessTokenProvider.java
index 6b25b85eae..d76446d17e 100644
--- 
a/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-bundle/nifi-oauth2-provider-service/src/main/java/org/apache/nifi/oauth2/StandardOauth2AccessTokenProvider.java
+++ 
b/nifi-extension-bundles/nifi-standard-services/nifi-oauth2-provider-bundle/nifi-oauth2-provider-service/src/main/java/org/apache/nifi/oauth2/StandardOauth2AccessTokenProvider.java
@@ -196,6 +196,14 @@ public class StandardOauth2AccessTokenProvider extends 
AbstractControllerService
         .required(true)
         .build();
 
+    public static final PropertyDescriptor DEFAULT_EXPIRATION_TIME = new 
PropertyDescriptor.Builder()
+        .name("Default Expiration Time")
+        .description("Expiration time to use when the returned access token 
does not include an expiration time.")
+        .addValidator(StandardValidators.TIME_PERIOD_VALIDATOR)
+        .defaultValue("1 hour")
+        .required(true)
+        .build();
+
     public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new 
PropertyDescriptor.Builder()
         .name("SSL Context Service")
         .addValidator(Validator.VALID)
@@ -231,6 +239,7 @@ public class StandardOauth2AccessTokenProvider extends 
AbstractControllerService
         RESOURCE,
         AUDIENCE,
         REFRESH_WINDOW,
+        DEFAULT_EXPIRATION_TIME,
         SSL_CONTEXT_SERVICE,
         HTTP_PROTOCOL_STRATEGY,
         ProxyConfiguration.createProxyConfigPropertyDescriptor(PROXY_SPECS)
@@ -257,6 +266,7 @@ public class StandardOauth2AccessTokenProvider extends 
AbstractControllerService
     private volatile String resource;
     private volatile String audience;
     private volatile long refreshWindowSeconds;
+    private volatile long defaultExpirationTimeSeconds;
     private volatile Map<String, String> customFormParameters = new 
HashMap<>();
 
     private volatile AccessToken accessDetails;
@@ -428,12 +438,13 @@ public class StandardOauth2AccessTokenProvider extends 
AbstractControllerService
 
             AccessToken accessDetailsWithRefreshTokenOnly = new AccessToken();
             accessDetailsWithRefreshTokenOnly.setRefreshToken(refreshToken);
-            accessDetailsWithRefreshTokenOnly.setExpiresIn(-1);
+            accessDetailsWithRefreshTokenOnly.setExpiresIn(-1L);
 
             this.accessDetails = accessDetailsWithRefreshTokenOnly;
         }
 
         refreshWindowSeconds = 
context.getProperty(REFRESH_WINDOW).asTimePeriod(TimeUnit.SECONDS);
+        defaultExpirationTimeSeconds = 
context.getProperty(DEFAULT_EXPIRATION_TIME).asTimePeriod(TimeUnit.SECONDS);
 
         Map<String, String> formParameters = new HashMap<>();
         for (PropertyDescriptor descriptor : context.getProperties().keySet()) 
{
@@ -456,8 +467,10 @@ public class StandardOauth2AccessTokenProvider extends 
AbstractControllerService
     }
 
     private boolean isRefreshRequired() {
+        final long expirationTime = accessDetails.getExpiresIn() != null ? 
accessDetails.getExpiresIn() : defaultExpirationTimeSeconds;
+
         final Instant expirationRefreshTime = accessDetails.getFetchTime()
-                .plusSeconds(accessDetails.getExpiresIn())
+                .plusSeconds(expirationTime)
                 .minusSeconds(refreshWindowSeconds);
 
         return Instant.now().isAfter(expirationRefreshTime);

Reply via email to