Skip to content

Instantly share code, notes, and snippets.

@nsivabalan
Last active September 13, 2020 12:04
Show Gist options
  • Save nsivabalan/84368ac7a740a6823cf7dc7add113c9b to your computer and use it in GitHub Desktop.
Save nsivabalan/84368ac7a740a6823cf7dc7add113c9b to your computer and use it in GitHub Desktop.
oAuth diff
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;
}
}
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