Compare commits

..

6 Commits

Author SHA1 Message Date
0258cfcb9a v2.0.8 pom 2023-06-29 10:46:39 -04:00
6fc43b85f7 Merge branch 'develop' into stable 2023-06-29 10:46:11 -04:00
d29ccbef79 added connect/read timeout configurability 2023-06-29 10:31:42 -04:00
512f118354 v2.0.7 pom 2023-06-12 17:23:23 -04:00
21255bfb3d Merge branch 'develop' into stable 2023-06-12 17:16:33 -04:00
f84279a148 better oauth token expiration handling 2023-06-12 17:16:03 -04:00
4 changed files with 47 additions and 4 deletions

View File

@@ -6,7 +6,7 @@
<groupId>com.inteligr8</groupId>
<artifactId>common-rest-client</artifactId>
<version>2.0.6</version>
<version>2.0.8</version>
<packaging>jar</packaging>
<name>ReST API Client for Java</name>

View File

@@ -14,6 +14,8 @@
*/
package com.inteligr8.rs;
import java.util.concurrent.TimeUnit;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
@@ -82,6 +84,11 @@ public abstract class Client {
ClientBuilder clientBuilder = ClientBuilder.newBuilder()
.register(provider)
.register(new LoggingFilter());
if (this.getConfig().getConnectTimeoutInMillis() != null)
clientBuilder.connectTimeout(this.getConfig().getConnectTimeoutInMillis(), TimeUnit.MILLISECONDS);
if (this.getConfig().getResponseTimeoutInMillis() != null)
clientBuilder.readTimeout(this.getConfig().getResponseTimeoutInMillis(), TimeUnit.MILLISECONDS);
if (authFilter == null)
authFilter = this.getConfig().createAuthorizationFilter();

View File

@@ -119,6 +119,16 @@ public interface ClientConfiguration {
}
default Integer getConnectTimeoutInMillis() {
return null;
}
default Integer getResponseTimeoutInMillis() {
return null;
}
/**
* @return true to enable Jackson UNWRAP_ROOT_VALUE feature; false otherwise.

View File

@@ -48,6 +48,7 @@ public abstract class OAuthAuthorizationFilter implements AuthorizationFilter {
private String accessToken;
private long expiration;
private String refreshToken;
private Long refreshTokenExpiration;
/**
* This constructor creates an OAuth-based authorization filter using the
@@ -99,8 +100,29 @@ public abstract class OAuthAuthorizationFilter implements AuthorizationFilter {
*/
@Override
public void filter(ClientRequestContext requestContext) {
if (this.accessToken == null || System.currentTimeMillis() > this.expiration)
this.requestToken();
if (this.accessToken == null) {
this.requestToken();
} else if (System.currentTimeMillis() >= this.expiration) {
this.logger.trace("Access token expired; retrieving new one with refresh token");
if (this.refreshTokenExpiration != null && System.currentTimeMillis() >= this.refreshTokenExpiration.longValue()) {
this.logger.debug("Refresh token expired; performing full authentication");
this.refreshToken = null;
this.requestToken();
} else {
try {
this.requestToken();
} catch (WebApplicationException wae) {
if (wae.getResponse().getStatusInfo().getFamily() == Family.CLIENT_ERROR) {
this.logger.debug("Received OAuth response {} using refresh token; performing full authentication", wae.getResponse().getStatus());
this.refreshToken = null;
this.requestToken();
} else {
throw wae;
}
}
}
}
requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, "Bearer " + this.accessToken);
}
@@ -139,6 +161,8 @@ public abstract class OAuthAuthorizationFilter implements AuthorizationFilter {
.register(new JacksonJaxbJsonProvider())
.build();
WebTarget target = client.target(this.tokenUrl);
long requestSendTime = System.currentTimeMillis();
Response response = target.request().post(entity);
@@ -160,8 +184,10 @@ public abstract class OAuthAuthorizationFilter implements AuthorizationFilter {
}
this.accessToken = (String)responseMap.get("access_token");
this.expiration = System.currentTimeMillis() + ((Number)responseMap.get("expires_in")).longValue() * 1000L;
this.expiration = requestSendTime + ((Number)responseMap.get("expires_in")).longValue() * 1000L;
this.refreshToken = (String)responseMap.get("refresh_token");
if (responseMap.containsKey("refresh_token_expires_in"))
this.refreshTokenExpiration = requestSendTime + ((Number)responseMap.get("refresh_token_expires_in")).longValue() * 1000L;
}
protected Form createRefreshForm() {