AuthResultExpiry.java

  1. package no.nav.data.common.security.azure.support;

  2. import com.github.benmanes.caffeine.cache.Expiry;
  3. import com.microsoft.aad.msal4j.IAuthenticationResult;
  4. import lombok.extern.slf4j.Slf4j;

  5. import java.time.Duration;
  6. import java.time.Instant;

  7. @Slf4j
  8. public class AuthResultExpiry implements Expiry<String, IAuthenticationResult> {

  9.     private static final Duration DEFAULT_EXPIRE = Duration.ofMinutes(1);
  10.     private static final Duration MIN_REFRESH_MARGIN = Duration.ofMinutes(10);
  11.     private static final Duration DOUBLE_MIN_REFRESH_MARGIN = MIN_REFRESH_MARGIN.multipliedBy(2);

  12.     @Override
  13.     public long expireAfterCreate(String key, IAuthenticationResult value, long currentTime) {
  14.         return expire(value).toNanos();
  15.     }

  16.     @Override
  17.     public long expireAfterUpdate(String key, IAuthenticationResult value, long currentTime, long currentDuration) {
  18.         return currentDuration;
  19.     }

  20.     @Override
  21.     public long expireAfterRead(String key, IAuthenticationResult value, long currentTime, long currentDuration) {
  22.         return currentDuration;
  23.     }

  24.     private Duration expire(IAuthenticationResult value) {
  25.         if (value.expiresOnDate().getTime() == 0L) {
  26.             log.debug("Acquired token, TTL missing default cache expire {}s", DEFAULT_EXPIRE.toSeconds());
  27.             return DEFAULT_EXPIRE;
  28.         }
  29.         Duration duration = Duration.between(Instant.now(), value.expiresOnDate().toInstant());
  30.         Duration expire = suggestedRefreshInterval(duration);
  31.         log.debug("Acquired token, TTL {}s cache expire {}s", duration.toSeconds(), expire.toSeconds());
  32.         return expire;
  33.     }

  34.     private static Duration suggestedRefreshInterval(Duration duration) {
  35.         if (duration.minus(DOUBLE_MIN_REFRESH_MARGIN).isNegative()) {
  36.             return duration.dividedBy(2);
  37.         } else {
  38.             return duration.minus(MIN_REFRESH_MARGIN);
  39.         }
  40.     }
  41. }