Last active
September 13, 2020 12:04
-
-
Save nsivabalan/84368ac7a740a6823cf7dc7add113c9b to your computer and use it in GitHub Desktop.
oAuth diff
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class AccessTokenLogoutInfo { | |
private String accessToken; | |
private boolean isLoggedout; | |
public AccessTokenLogoutInfo(String accessToken, boolean isLoggedout) { | |
this.accessToken = accessToken; | |
this.isLoggedout = isLoggedout; | |
} | |
public String getAccessToken() { | |
return accessToken; | |
} | |
public boolean isLoggedout() { | |
return isLoggedout; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/libraries/common/auth/oauth-token-manager/src/main/java/com/ubercab/core/oauth_token_manager/OAuthAuthenticator.java b/libraries/common/auth/oauth-token-manager/src/main/java/com/ubercab/core/oauth_token_manager/OAuthAuthenticator.java | |
index af93426cf31c..9c9ff1a453e8 100644 | |
--- a/libraries/common/auth/oauth-token-manager/src/main/java/com/ubercab/core/oauth_token_manager/OAuthAuthenticator.java | |
+++ b/libraries/common/auth/oauth-token-manager/src/main/java/com/ubercab/core/oauth_token_manager/OAuthAuthenticator.java | |
@@ -55,15 +55,15 @@ public class OAuthAuthenticator { | |
* @param oldAccessToken The invalid access token that is being refreshed | |
* @return new accessToken or empty string if the network request fails | |
*/ | |
- public synchronized Single<String> authenticate( | |
+ public synchronized Single<AccessTokenLogoutInfo> authenticate( | |
@Nullable String oldAccessToken, boolean isBlocking) { | |
// do we need to check this here or at the beginning of OAuthCore#retrieveAccessToken | |
if (logout.get()) { | |
- return ""; | |
+ return Single.just(new AccessTokenLogoutInfo(null, true)); | |
} | |
if (!oAuthTokenManager.isAccessTokenExpired()) { | |
- return Single.just(oAuthTokenManager.getAccessToken()); | |
+ return Single.just(new AccessTokenLogoutInfo(oAuthTokenManager.getAccessToken(), false)); | |
} | |
/*if (oldAccessToken != null | |
@@ -86,7 +86,7 @@ public class OAuthAuthenticator { | |
.doOnSubscribe(unit -> frequencyCalculator.hit()) | |
.doOnComplete(() -> onAccessTokenSaved(isBlocking, timestamp)) | |
.doOnError(throwable -> onError(throwable, isBlocking)) // todo. when is this called vs | |
- .andThen(Single.fromCallable(() -> oAuthTokenManager.getAccessToken())) | |
+ .andThen(Single.fromCallable(() -> new AccessTokenLogoutInfo(oAuthTokenManager.getAccessToken(), false))) | |
// retry attempts. | |
.retryWhen( | |
error -> { | |
diff --git a/libraries/common/auth/oauth-token-manager/src/main/java/com/ubercab/core/oauth_token_manager/OAuthCore.java b/libraries/common/auth/oauth-token-manager/src/main/java/com/ubercab/core/oauth_token_manager/OAuthCore.java | |
index 4a13290a0c33..86ab9b26f056 100644 | |
--- a/libraries/common/auth/oauth-token-manager/src/main/java/com/ubercab/core/oauth_token_manager/OAuthCore.java | |
+++ b/libraries/common/auth/oauth-token-manager/src/main/java/com/ubercab/core/oauth_token_manager/OAuthCore.java | |
@@ -18,6 +18,11 @@ public class OAuthCore { | |
private static final String TAG = OAuthCore.class.getName(); | |
+ private static final long REFRESH_BEFORE_EXPIRY_MILLISECONDS_DEFAULT = 120000; | |
+ private static final String REFRESH_BEFORE_EXPIRY_MILLISECONDS_PARAM = | |
+ "refreshBeforeExpiryMilliSeconds"; | |
+ private static final int REFRESH_MAX_TRIES_DEFAULT = 30; | |
+ | |
private static OAuthCore singleInstance; | |
private AtomicBoolean tokenRetrievalInProgress = new AtomicBoolean(false); | |
private OAuthTokenManager oAuthTokenManager; | |
@@ -26,8 +31,14 @@ public class OAuthCore { | |
private OAuthAnalytics oAuthAnalytics; | |
@Nullable private Subscription experimentSubscription; | |
@Nullable private DynamicExperiments dynamicExperiments; | |
- @VisibleForTesting @Nullable private ExperimentUpdate oauthEnabled; | |
- @VisibleForTesting @Nullable ExperimentUpdate oAuthLogoutStatusCodeKillSwitch; | |
+ @VisibleForTesting | |
+ @Nullable | |
+ private ExperimentUpdate oauthEnabled; | |
+ @VisibleForTesting | |
+ @Nullable | |
+ ExperimentUpdate oAuthLogoutStatusCodeKillSwitch; | |
+ private AtomicBoolean refreshBeforeExpirySet = new AtomicBoolean(false); | |
+ private long refreshBeforeExpiryMs = -1; | |
private OAuthCore( | |
OAuthTokenManager oAuthTokenManager, | |
@@ -66,14 +77,16 @@ public class OAuthCore { | |
return singleInstance; | |
} | |
- /** Resets all tracking variables. */ | |
+ /** | |
+ * Resets all tracking variables. | |
+ */ | |
public void reset() { | |
tokenRetrievalInProgress.set(false); | |
} | |
- public boolean isRefreshTokenNull() { | |
+ /*public boolean isRefreshTokenNull() { | |
return oAuthTokenManager.getRefreshToken() == null; | |
- } | |
+ }*/ | |
// Every new call should invoke this and on false, should call fetchToken() to retrieve the access token. | |
public boolean shouldSkipOAuth() { | |
@@ -90,10 +103,33 @@ public class OAuthCore { | |
startSubscription(dynamicExperiments); | |
} | |
- if (oauthEnabled == null || !oauthEnabled.isTreated()) { | |
+ if (oauthEnabled == null) { | |
return true; | |
+ } else { | |
+ if (!refreshBeforeExpirySet.getAndSet(true)) { | |
+ refreshBeforeExpiryMs = oauthEnabled.getLongParameter( | |
+ REFRESH_BEFORE_EXPIRY_MILLISECONDS_PARAM, REFRESH_BEFORE_EXPIRY_MILLISECONDS_DEFAULT); | |
+ } | |
+ return !oauthEnabled.isTreated(); | |
} | |
- return false; | |
+ } | |
+ | |
+ /** | |
+ * Should be called only by non refresh token requests. | |
+ * @return | |
+ */ | |
+ public String fetchAccessToken() { | |
+ String toReturn; | |
+ if (!oAuthTokenManager.isAccessTokenExpired()) { | |
+ toReturn = oAuthTokenManager.getAccessToken(); | |
+ } else { | |
+ toReturn = retrieveAccessToken(true); | |
+ } | |
+ // trigger async retrieval | |
+ if(!tokenRetrievalInProgress.get() && willAccessTokenExpire(refreshBeforeExpiryMs)){ | |
+ refreshTokenAsync(); | |
+ } | |
+ return toReturn; | |
} | |
/** | |
@@ -105,12 +141,14 @@ public class OAuthCore { | |
* | |
* @return the token thus refreshed. | |
*/ | |
- public synchronized String retrieveAccessToken(boolean isBlocking) { | |
+ public synchronized AccessTokenLogoutInfo retrieveAccessToken(boolean isBlocking) { | |
if (oAuthAuthenticator.isLoggedOut()) { | |
oAuthAnalytics.logEvent(LOGGING_OUT_DO_NOT_REFRESH_TOKEN); | |
- return ""; | |
+ return new AccessTokenLogoutInfo(null, true); | |
} | |
- if (oAuthTokenManager.isAccessTokenExpired()) { | |
+ if(!oAuthTokenManager.isAccessTokenExpired()){ | |
+ return new AccessTokenLogoutInfo(oAuthTokenManager.getAccessToken(), false); | |
+ } else{ | |
String refreshTokenEventId = | |
isBlocking ? TOKEN_REFRESH_BLOCKING_EVENT_ID : TOKEN_REFRESH_EVENT_ID; | |
oAuthAnalytics.logEvent( | |
@@ -128,9 +166,9 @@ public class OAuthCore { | |
.authenticate(oAuthTokenManager.getAccessToken(), isBlocking) | |
.doFinally(() -> tokenRetrievalInProgress.set(false)) | |
.subscribe(); | |
+ return new AccessTokenLogoutInfo(oAuthTokenManager.getAccessToken(), false); | |
} | |
} | |
- return oAuthTokenManager.getAccessToken(); | |
} | |
public String getAccessToken() { |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment