private AccessToken fetchAccessToken() throws IOException { LOG.debug("Authentication is enabled in the gateway server. Authentication URI {}.", getAuthURI()); return execute(HttpRequest.get(getAuthURI().toURL()) .addHeaders(getAuthenticationHeaders()) .build() ); }
@Override public AccessToken getAccessToken() throws IOException { if (!isAuthEnabled()) { return null; } if (accessToken == null || isTokenExpired()) { long requestTime = System.currentTimeMillis(); accessToken = fetchAccessToken(); expirationTime = requestTime + TimeUnit.SECONDS.toMillis(accessToken.getExpiresIn()) - SPARE_TIME_IN_MILLIS; LOG.debug("Received the access token successfully. Expiration date is {}.", new Date(expirationTime)); } return accessToken; }
@Override public boolean isAuthEnabled() throws IOException { if (authEnabled == null) { String strAuthURI = fetchAuthURI(); authEnabled = StringUtils.isNotEmpty(strAuthURI); if (authEnabled) { authURI = URI.create(strAuthURI); } } return authEnabled; }
/** * Fetches the available authentication server URL, if authentication is enabled in the gateway server, * otherwise, empty string will be returned. * * @return string value of the authentication server URL * @throws IOException IOException in case of a problem or the connection was aborted or if url list is empty */ private String fetchAuthURI() throws IOException { if (pingURI == null) { throw new IllegalStateException("Connection information not set!"); } LOG.debug("Try to get the authentication URI from the gateway server: {}.", pingURI); HttpResponse response = HttpRequests.execute(HttpRequest.get(pingURI.toURL()).build(), getHttpRequestConfig()); LOG.debug("Got response {} - {} from {}", response.getResponseCode(), response.getResponseMessage(), pingURI); if (response.getResponseCode() != HttpURLConnection.HTTP_UNAUTHORIZED) { return ""; } Map<String, List<String>> responseMap = ObjectResponse.fromJsonBody(response, AUTH_URL_RESPONSE_TYPE_TOKEN).getResponseObject(); LOG.debug("Response map from gateway server: {}", responseMap); String result; List<String> uriList = responseMap.get(AUTH_URI_KEY); if (uriList != null && !uriList.isEmpty()) { result = uriList.get(RANDOM.nextInt(uriList.size())); } else { throw new IOException("Authentication servers list is empty."); } return result; }
@Override public AccessToken get() { try { return getAccessToken(); } catch (IOException e) { throw Throwables.propagate(e); } }
private HttpRequestConfig getHttpRequestConfig() { return new HttpRequestConfig(0, 0, isVerifySSLCert()); } }
/** * Executes fetch access token request. * * @param request the http request to fetch access token from the authentication server * @return {@link AccessToken} object containing the access token * @throws IOException IOException in case of a problem or the connection was aborted or if the access token is not * received successfully from the authentication server */ private AccessToken execute(HttpRequest request) throws IOException { HttpResponse response = HttpRequests.execute(request, getHttpRequestConfig()); LOG.debug("Got response {} - {} from {}", response.getResponseCode(), response.getResponseMessage(), pingURI); if (response.getResponseCode() != HttpURLConnection.HTTP_OK) { throw new HttpFailureException(response.getResponseMessage(), response.getResponseCode()); } Map<String, String> responseMap = ObjectResponse.fromJsonBody(response, ACCESS_TOKEN_RESPONSE_TYPE_TOKEN).getResponseObject(); String tokenValue = responseMap.get(ACCESS_TOKEN_KEY); String tokenType = responseMap.get(TOKEN_TYPE_KEY); String expiresInStr = responseMap.get(EXPIRES_IN_KEY); LOG.debug("Response map from auth server: {}", responseMap); if (StringUtils.isEmpty(tokenValue) || StringUtils.isEmpty(tokenType) || StringUtils.isEmpty(expiresInStr)) { throw new IOException("Unexpected response was received from the authentication server."); } return new AccessToken(tokenValue, Long.valueOf(expiresInStr), tokenType); }