fix issue with expired token refreshing

This commit is contained in:
cbornet 2016-05-13 16:23:51 +00:00
parent dfda700e7e
commit f87d718836

View File

@ -23,14 +23,17 @@ import feign.Request.Options;
import feign.RequestInterceptor; import feign.RequestInterceptor;
import feign.RequestTemplate; import feign.RequestTemplate;
import feign.Response; import feign.Response;
import feign.RetryableException;
import feign.Util; import feign.Util;
import {{invokerPackage}}.StringUtil; import {{invokerPackage}}.StringUtil;
public class OAuth implements RequestInterceptor { public class OAuth implements RequestInterceptor {
static final int MILLIS_PER_SECOND = 1000;
public interface AccessTokenListener { public interface AccessTokenListener {
public void notify(BasicOAuthToken token); void notify(BasicOAuthToken token);
} }
private volatile String accessToken; private volatile String accessToken;
@ -41,21 +44,13 @@ public class OAuth implements RequestInterceptor {
private AccessTokenListener accessTokenListener; private AccessTokenListener accessTokenListener;
public OAuth(Client client, TokenRequestBuilder requestBuilder) { public OAuth(Client client, TokenRequestBuilder requestBuilder) {
setOauthClient(client); this.oauthClient = new OAuthClient(new OAuthFeignClient(client));
this.tokenRequestBuilder = requestBuilder; this.tokenRequestBuilder = requestBuilder;
} }
public OAuth(Client client, OAuthFlow flow, String authorizationUrl, String tokenUrl, String scopes) { public OAuth(Client client, OAuthFlow flow, String authorizationUrl, String tokenUrl, String scopes) {
this(client, OAuthClientRequest.tokenLocation(tokenUrl).setScope(scopes)); this(client, OAuthClientRequest.tokenLocation(tokenUrl).setScope(scopes));
setFlow(flow);
authenticationRequestBuilder = OAuthClientRequest.authorizationLocation(authorizationUrl);
}
public OAuth(OAuthFlow flow, String authorizationUrl, String tokenUrl, String scopes) {
this(new Client.Default(null, null), flow, authorizationUrl, tokenUrl, scopes);
}
public void setFlow(OAuthFlow flow) {
switch(flow) { switch(flow) {
case accessCode: case accessCode:
case implicit: case implicit:
@ -70,6 +65,11 @@ public class OAuth implements RequestInterceptor {
default: default:
break; break;
} }
authenticationRequestBuilder = OAuthClientRequest.authorizationLocation(authorizationUrl);
}
public OAuth(OAuthFlow flow, String authorizationUrl, String tokenUrl, String scopes) {
this(new Client.Default(null, null), flow, authorizationUrl, tokenUrl, scopes);
} }
@Override @Override
@ -80,24 +80,20 @@ public class OAuth implements RequestInterceptor {
} }
// If first time, get the token // If first time, get the token
if (expirationTimeMillis == null || System.currentTimeMillis() >= expirationTimeMillis) { if (expirationTimeMillis == null || System.currentTimeMillis() >= expirationTimeMillis) {
try {
updateAccessToken(); updateAccessToken();
} catch (OAuthSystemException e) {
e.printStackTrace();
return;
} catch (OAuthProblemException e) {
e.printStackTrace();
return;
}
} }
if (getAccessToken() != null) { if (getAccessToken() != null) {
template.header("Authorization", "Bearer " + getAccessToken()); template.header("Authorization", "Bearer " + getAccessToken());
} }
} }
public synchronized void updateAccessToken() throws OAuthSystemException, OAuthProblemException { public synchronized void updateAccessToken() {
if (getAccessToken() == null) { OAuthJSONAccessTokenResponse accessTokenResponse;
OAuthJSONAccessTokenResponse accessTokenResponse = oauthClient.accessToken(tokenRequestBuilder.buildBodyMessage()); try {
accessTokenResponse = oauthClient.accessToken(tokenRequestBuilder.buildBodyMessage());
} catch (Exception e) {
throw new RetryableException(e.getMessage(), e,null);
}
if (accessTokenResponse != null && accessTokenResponse.getAccessToken() != null) { if (accessTokenResponse != null && accessTokenResponse.getAccessToken() != null) {
setAccessToken(accessTokenResponse.getAccessToken(), accessTokenResponse.getExpiresIn()); setAccessToken(accessTokenResponse.getAccessToken(), accessTokenResponse.getExpiresIn());
if (accessTokenListener != null) { if (accessTokenListener != null) {
@ -105,9 +101,8 @@ public class OAuth implements RequestInterceptor {
} }
} }
} }
}
public void registerAccessTokenListener(AccessTokenListener accessTokenListener) { public synchronized void registerAccessTokenListener(AccessTokenListener accessTokenListener) {
this.accessTokenListener = accessTokenListener; this.accessTokenListener = accessTokenListener;
} }
@ -117,7 +112,7 @@ public class OAuth implements RequestInterceptor {
public synchronized void setAccessToken(String accessToken, Long expiresIn) { public synchronized void setAccessToken(String accessToken, Long expiresIn) {
this.accessToken = accessToken; this.accessToken = accessToken;
this.expirationTimeMillis = System.currentTimeMillis() + expiresIn * 1000; this.expirationTimeMillis = System.currentTimeMillis() + expiresIn * MILLIS_PER_SECOND;
} }
public TokenRequestBuilder getTokenRequestBuilder() { public TokenRequestBuilder getTokenRequestBuilder() {
@ -148,7 +143,7 @@ public class OAuth implements RequestInterceptor {
this.oauthClient = new OAuthClient( new OAuthFeignClient(client)); this.oauthClient = new OAuthClient( new OAuthFeignClient(client));
} }
public class OAuthFeignClient implements HttpClient { public static class OAuthFeignClient implements HttpClient {
private Client client; private Client client;
@ -198,6 +193,5 @@ public class OAuth implements RequestInterceptor {
public void shutdown() { public void shutdown() {
// Nothing to do here // Nothing to do here
} }
} }
} }