diff --git a/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/tokenprovider/AbstractUaaTokenProvider.java b/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/tokenprovider/AbstractUaaTokenProvider.java index 330e9b92f25..b8ddbd74ac1 100644 --- a/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/tokenprovider/AbstractUaaTokenProvider.java +++ b/cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/tokenprovider/AbstractUaaTokenProvider.java @@ -105,7 +105,33 @@ public Flux getRefreshTokens(ConnectionContext connectionContext) { @Override public final Mono getToken(ConnectionContext connectionContext) { - return this.accessTokens.computeIfAbsent(connectionContext, this::token); + Mono accessToken = this.accessTokens.get(connectionContext); + if(accessToken != null) { + try { + String token = this.accessTokens.get(connectionContext).map(s -> s.split(" ")[1]).block(); + exctractClaimsFromToken(token) + .ifPresent(claims -> { + Date expirationTime = claims.getExpiration(); + int i = expirationTime.compareTo(new Date()); + long milliSeconds = expirationTime.getTime() - new Date().getTime(); + // invalidate the token if it is going to be expired in one minute. + boolean isTokenInvalid = ((i <= 0) || (i == 1 && milliSeconds <= 60000)); + if(isTokenInvalid) { + LOGGER.debug("Invalidating Access Token"); + invalidate(connectionContext); + LOGGER.debug("Invalidated Access Token"); + } + }); + + }catch (Exception e) { + LOGGER.debug("Invalidating Expired Access Token"); + invalidate(connectionContext); + LOGGER.debug("Invalidated Expired Access Token"); + } + return this.accessTokens.get(connectionContext); + }else { + return this.accessTokens.computeIfAbsent(connectionContext, this::token); + } } @Override @@ -279,5 +305,12 @@ private static final class RefreshToken { private FluxSink sink = this.processor.sink(); } + + private static Optional exctractClaimsFromToken(String token) { + + String jws = token.substring(0, token.lastIndexOf('.') + 1); + return Optional.of(Jwts.parser().parseClaimsJwt(jws).getBody()); + + } }