private void updateToken(final Tokens tokens) { currentTokensOption = Optional.of(tokens); final String accessToken = tokens.getAccessToken(); if (currentAccessTokenFuture.isDone()) { currentAccessTokenFuture = CompletableFutureUtils.successful(accessToken); } else { currentAccessTokenFuture.complete(accessToken); } } }
private void logTokenResult(final CompletableFuture<Tokens> result) { result.whenComplete((tokens, e) -> { if (tokens != null) { AUTH_LOGGER.debug(() -> "Successfully fetched token that expires in " + tokens.getExpiresIn().map(x -> x.toString()).orElse("an unknown time") + "."); } else { AUTH_LOGGER.error(() -> "Failed to fetch token." + tokens.getExpiresIn(), e); } }); }
@JsonIgnore public static Tokens of(String accessToken, String refreshToken, Optional<Long> expiresIn) { return new Tokens(accessToken, refreshToken, expiresIn); } }
private void update(Tokens tokens, Exception e) { synchronized (accessTokenLock) { try { if (e == null) { AccessToken newToken = new AccessToken(tokens.getAccessToken(), tokens.getExpiresIn(), System.currentTimeMillis()); this.accessTokenResult = Optional.of(new ValidationE<>(newToken, null)); AUTH_LOGGER.debug(() -> "Refreshed access token."); scheduleNextRefresh(tokens); } else { this.accessTokenResult = Optional.of(ValidationE.<AccessToken>error(new SphereClientException(e))); AUTH_LOGGER.error(() -> "Failed to refresh access token.", e); } } finally { accessTokenLock.notifyAll(); } } }
private ZonedDateTime oldExpiringZonedDateTime() { return Optional.ofNullable(currentTokensOption.get().getExpiresZonedDateTime()).orElseGet(() -> ZonedDateTime.now()); } }
/** Parses Tokens from a response from the backend authorization service. * @param response Response from the authorization service. */ private Tokens parseResponse(final HttpResponse response) { if (response.getStatusCode() == 401 && response.getResponseBody().isPresent()) { UnauthorizedException authorizationException = new UnauthorizedException(response.toString()); try { final JsonNode jsonNode = JsonUtils.readTree(response.getResponseBody().get()); if (jsonNode.get("error").asText().equals("invalid_client")) { authorizationException = new InvalidClientCredentialsException(config); } } catch (final JsonException e) { authorizationException = new UnauthorizedException(response.toString(), e); } authorizationException.setProjectKey(config.getProjectKey()); authorizationException.setUnderlyingHttpResponse(response); throw authorizationException; } return JsonUtils.readObject(Tokens.typeReference(), response.getResponseBody().get()); } }
private Instant oldExpiringInstant() { return currentTokensOption.get().getExpiresInstant().orElseGet(() -> Instant.now()); }
private ZonedDateTime oldExpiringZonedDateTime() { return Optional.ofNullable(currentTokensOption.get().getExpiresZonedDateTime()).orElseGet(() -> ZonedDateTime.now()); } }
return SphereJsonUtils.readObject(httpResponse.getResponseBody(), Tokens.typeReference()); } catch (final SphereException e) { throw e;
/** * if the last token has no expire time it true * @return */ private boolean lastTokenIsStillValid() { if (currentTokensOption.isPresent()) { final Tokens oldTokens = currentTokensOption.get(); return oldTokens.getExpiresInstant().map(expireTime -> expireTime.isAfter(Instant.now())).orElse(true); } else { return false; } }
private void updateToken(final Tokens tokens) { currentTokensOption = Optional.of(tokens); final String accessToken = tokens.getAccessToken(); if (currentAccessTokenFuture.isDone()) { currentAccessTokenFuture = CompletableFutureUtils.successful(accessToken); } else { currentAccessTokenFuture.complete(accessToken); } } }
private void scheduleNextRefresh(Tokens tokens) { if (!tokens.getExpiresIn().isPresent()) { AUTH_LOGGER.warn(() -> "Authorization server did not provide expires_in for the access token."); return; } if (tokens.getExpiresIn().get() * 1000 < TOKEN_ABOUT_TO_EXPIRE_MS) { AUTH_LOGGER.warn(() -> "Authorization server returned an access token with a very short validity of " + tokens.getExpiresIn().get() + "s!"); return; } long refreshTimeout = tokens.getExpiresIn().get() * 1000 - TOKEN_ABOUT_TO_EXPIRE_MS; AUTH_LOGGER.debug(() -> "Scheduling next token refresh " + refreshTimeout / 1000 + "s from now."); refreshTimer.schedule(new TimerTask() { public void run() { beginRefresh(); } }, refreshTimeout); }
private ZonedDateTime oldExpiringZonedDateTime() { return Optional.ofNullable(currentTokensOption.get().getExpiresZonedDateTime()).orElseGet(() -> ZonedDateTime.now()); }
return SphereJsonUtils.readObject(httpResponse.getResponseBody(), Tokens.typeReference()); } catch (final SphereException e) { throw e;
@JsonIgnore public static Tokens of(String accessToken, String refreshToken, Long expiresIn) { return new Tokens(accessToken, refreshToken, expiresIn); } }
private Instant newExpiringInstant(final Tokens newTokens) { return newTokens.getExpiresInstant().orElseGet(() -> Instant.now().plusSeconds(30 * 60)); }
private void requestUpdateTokens(final Tokens tokens) { if (!currentTokensOption.isPresent() || currentTokenIsOlder(tokens)) { currentTokensOption = Optional.ofNullable(tokens); final String accessToken = tokens.getAccessToken(); if (currentAccessTokenFuture.isDone()) { currentAccessTokenFuture = CompletableFutureUtils.successful(accessToken); } else { currentAccessTokenFuture.complete(accessToken); } } }
private void scheduleNextTokenFetchFromSphere(final Tokens tokens) { final Long delayInSecondsToFetchNewToken = Optional.ofNullable(tokens.getExpiresIn()).map(ttlInSeconds -> ttlInSeconds - 60 * 60).orElse(60 * 30L); schedule(new FetchTokenFromSphereMessage(), delayInSecondsToFetchNewToken, TimeUnit.SECONDS); }
/** * if the last token has no expire time it true * @return */ private boolean lastTokenIsStillValid() { if (currentTokensOption.isPresent()) { final Tokens oldTokens = currentTokensOption.get(); return Optional.ofNullable(oldTokens.getExpiresZonedDateTime()).map(expireTime -> expireTime.isAfter(ZonedDateTime.now())).orElse(true); } else { return false; } }
return SphereJsonUtils.readObject(httpResponse.getResponseBody(), Tokens.typeReference()); } catch (final SphereException e) { throw e;