@@ -67,7 +67,7 @@ public class ConfidentialClient implements OAuth2Client {
6767 public ConfidentialClient (final String configPath )
6868 throws AuthServerMetadataContentException , AuthServerMetadataException ,
6969 ConfigurationException {
70- this (new Configuration (configPath ), RequestOptions .builder ().build (), Constants . DEFAULT_ACCESS_TOKEN_EXPIRY_OFFSET_MILLIS );
70+ this (new Configuration (configPath ), RequestOptions .builder ().build ());
7171 }
7272
7373 /**
@@ -85,19 +85,7 @@ public ConfidentialClient(final String configPath)
8585 public ConfidentialClient (final String configPath , RequestOptions requestOptions )
8686 throws AuthServerMetadataContentException , AuthServerMetadataException ,
8787 ConfigurationException {
88- this (new Configuration (configPath ), requestOptions , Constants .DEFAULT_ACCESS_TOKEN_EXPIRY_OFFSET_MILLIS );
89- }
90-
91- /**
92- * Creates a new ConfidentialClient with a custom proactive expiry offset.
93- * @param configPath path to config file
94- * @param requestOptions request options (proxy/ssl)
95- * @param accessTokenExpiryOffsetMillis milliseconds subtracted from server expiry (non-negative)
96- */
97- public ConfidentialClient (final String configPath , RequestOptions requestOptions , long accessTokenExpiryOffsetMillis )
98- throws AuthServerMetadataContentException , AuthServerMetadataException ,
99- ConfigurationException {
100- this (new Configuration (configPath ), requestOptions , accessTokenExpiryOffsetMillis );
88+ this (new Configuration (configPath ), requestOptions );
10189 }
10290
10391 /**
@@ -112,7 +100,7 @@ public ConfidentialClient(final String configPath, RequestOptions requestOptions
112100 */
113101 public ConfidentialClient (final Configuration config )
114102 throws AuthServerMetadataContentException , AuthServerMetadataException {
115- this (config , RequestOptions .builder ().build (), Constants . DEFAULT_ACCESS_TOKEN_EXPIRY_OFFSET_MILLIS );
103+ this (config , RequestOptions .builder ().build ());
116104 }
117105
118106 /**
@@ -128,22 +116,11 @@ public ConfidentialClient(final Configuration config)
128116 */
129117 public ConfidentialClient (final Configuration config , RequestOptions requestOptions )
130118 throws AuthServerMetadataContentException , AuthServerMetadataException {
131- this (config , requestOptions , Constants .DEFAULT_ACCESS_TOKEN_EXPIRY_OFFSET_MILLIS );
132- }
133-
134- /**
135- * Core constructor with configurable access token proactive expiry offset.
136- * @param config configuration
137- * @param requestOptions request options
138- * @param accessTokenExpiryOffsetMillis milliseconds to subtract from token lifetime when computing internal expiry
139- */
140- public ConfidentialClient (final Configuration config , RequestOptions requestOptions , long accessTokenExpiryOffsetMillis )
141- throws AuthServerMetadataContentException , AuthServerMetadataException {
142119 Objects .requireNonNull (config , "Configuration object must not be null" );
143120 this .config = config ;
144121 LOGGER .debug ("Finished initialising configuration" );
145122 this .requestOptions = requestOptions == null ? RequestOptions .builder ().build () : requestOptions ;
146- this .accessTokenExpiryOffsetMillis = accessTokenExpiryOffsetMillis ;
123+ this .accessTokenExpiryOffsetMillis = this . requestOptions . getAccessTokenExpiryOffsetMillis () ;
147124 this .requestProviderMetadata ();
148125 }
149126
@@ -163,7 +140,7 @@ protected ConfidentialClient(final String configPath, final TokenRequestBuilder
163140 throws AuthServerMetadataContentException ,
164141 AuthServerMetadataException ,
165142 ConfigurationException {
166- this (new Configuration (configPath ), RequestOptions .builder ().build (), Constants . DEFAULT_ACCESS_TOKEN_EXPIRY_OFFSET_MILLIS );
143+ this (new Configuration (configPath ), RequestOptions .builder ().build ());
167144 this .tokenRequestBuilder = tokReqBuilder .uri (this .providerMetadata .getTokenEndpointURI ());
168145 }
169146
@@ -181,7 +158,7 @@ protected ConfidentialClient(final String configPath, final TokenRequestBuilder
181158 protected ConfidentialClient (final Configuration config , final TokenRequestBuilder tokReqBuilder )
182159 throws AuthServerMetadataContentException ,
183160 AuthServerMetadataException {
184- this (config , RequestOptions .builder ().build (), Constants . DEFAULT_ACCESS_TOKEN_EXPIRY_OFFSET_MILLIS );
161+ this (config , RequestOptions .builder ().build ());
185162 this .tokenRequestBuilder = tokReqBuilder .uri (this .providerMetadata .getTokenEndpointURI ());
186163 }
187164
@@ -200,7 +177,7 @@ protected ConfidentialClient(final Configuration config, final TokenRequestBuild
200177 protected ConfidentialClient (final Configuration config , final TokenRequestBuilder tokReqBuilder , RequestOptions requestOptions )
201178 throws AuthServerMetadataContentException ,
202179 AuthServerMetadataException {
203- this (config , requestOptions , Constants . DEFAULT_ACCESS_TOKEN_EXPIRY_OFFSET_MILLIS );
180+ this (config , requestOptions );
204181 this .tokenRequestBuilder = tokReqBuilder .uri (this .providerMetadata .getTokenEndpointURI ());
205182 }
206183
@@ -306,9 +283,21 @@ private String fetchAccessToken() throws AccessTokenException, SigningJwsExcepti
306283
307284 if (tokenRes .indicatesSuccess ()) {
308285 this .accessToken = tokenRes .toSuccessResponse ().getTokens ().getAccessToken ();
309- this .accessTokenExpireTime =
310- this .jwsIssuedAt + TimeUnit .SECONDS .toMillis (this .accessToken .getLifetime ()) - this .accessTokenExpiryOffsetMillis ;
311- LOGGER .info ("Fetched access token which expires in: {} seconds (buffered)" , this .accessToken .getLifetime ());
286+ long lifetimeMillis = TimeUnit .SECONDS .toMillis (this .accessToken .getLifetime ());
287+ long rawOffset = this .accessTokenExpiryOffsetMillis ;
288+
289+ long clampedOffset ;
290+ if (rawOffset >= 899_000L ) {
291+ clampedOffset = 899_000L - 1 ;
292+ LOGGER .warn ("Proactive expiry offset {}ms >= 899 seconds. Clamped to {}ms." , rawOffset , clampedOffset );
293+ } else {
294+ clampedOffset = rawOffset ;
295+ }
296+
297+ long effectiveLifetime = lifetimeMillis - clampedOffset ;
298+ this .accessTokenExpireTime = this .jwsIssuedAt + effectiveLifetime ;
299+ LOGGER .info ("Fetched access token (serverLifetime={}s, offsetApplied={}ms, effectiveLifetime={}ms)" ,
300+ this .accessToken .getLifetime (), clampedOffset , effectiveLifetime );
312301 return this .accessToken .toString ();
313302 }
314303
0 commit comments