Skip to content

Commit aeab642

Browse files
authored
Update default token refresh rate (#2617)
* Update token refresh rate to new defaults. * Update tests.
1 parent c923ddf commit aeab642

File tree

3 files changed

+16
-11
lines changed

3 files changed

+16
-11
lines changed

appcheck/firebase-appcheck/src/main/java/com/google/firebase/appcheck/internal/DefaultAppCheckToken.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,10 @@ public long getExpireTimeMillis() {
9696
return receivedAtTimestamp + expiresInMillis;
9797
}
9898

99-
@VisibleForTesting
10099
long getReceivedAtTimestamp() {
101100
return receivedAtTimestamp;
102101
}
103102

104-
@VisibleForTesting
105103
long getExpiresInMillis() {
106104
return expiresInMillis;
107105
}

appcheck/firebase-appcheck/src/main/java/com/google/firebase/appcheck/internal/TokenRefreshManager.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
public final class TokenRefreshManager {
3030

3131
private static final long REFRESH_BUFFER_ABSOLUTE_MILLIS = 60 * 1000; // 60 seconds
32-
private static final double REFRESH_BUFFER_FRACTION = 0.9;
32+
private static final double REFRESH_BUFFER_FRACTION = 0.5;
33+
private static final long FIVE_MINUTES_IN_MILLIS = 5 * 60 * 1000;
3334
private static final long UNSET_REFRESH_TIME = -1;
3435

3536
private final DefaultTokenRefresher tokenRefresher;
@@ -84,13 +85,16 @@ public void maybeScheduleTokenRefresh(@NonNull AppCheckToken token) {
8485
defaultToken = DefaultAppCheckToken.constructFromRawToken(token.getToken());
8586
}
8687

87-
// The next refresh time is either receivedAt + 0.9*expiresIn or 60 seconds before expiration,
88-
// whichever is earlier.
88+
// The next refresh time is receivedAt + 0.5*expiresIn + 5 minutes.
8989
nextRefreshTimeMillis =
90-
Math.min(
91-
defaultToken.getReceivedAtTimestamp()
92-
+ (long) (REFRESH_BUFFER_FRACTION * defaultToken.getExpiresInMillis()),
93-
defaultToken.getExpireTimeMillis() - REFRESH_BUFFER_ABSOLUTE_MILLIS);
90+
defaultToken.getReceivedAtTimestamp()
91+
+ (long) (REFRESH_BUFFER_FRACTION * defaultToken.getExpiresInMillis())
92+
+ FIVE_MINUTES_IN_MILLIS;
93+
if (nextRefreshTimeMillis > defaultToken.getExpireTimeMillis()) {
94+
// This shouldn't happen, as the minimum allowed TTL should be at least 15 minutes, but adding
95+
// this check to be safe.
96+
nextRefreshTimeMillis = defaultToken.getExpireTimeMillis() - REFRESH_BUFFER_ABSOLUTE_MILLIS;
97+
}
9498
if (shouldScheduleRefresh()) {
9599
tokenRefresher.scheduleRefresh(nextRefreshTimeMillis - clock.currentTimeMillis());
96100
}

appcheck/firebase-appcheck/src/test/java/com/google/firebase/appcheck/internal/TokenRefreshManagerTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class TokenRefreshManagerTest {
3636
private static final String TOKEN_PAYLOAD = "tokenPayload";
3737
private static final long EXPIRES_IN_ONE_HOUR_MILLIS = 60L * 60L * 1000L;
3838
private static final long EXPIRE_IN_THREE_MINUTES_MILLIS = 3L * 60L * 1000L;
39-
private static final long NINE_TENTHS_HOUR_MILLIS = 3240000L; // 0.9 * 1 hour
39+
private static final long THIRTY_FIVE_MINUTES_MILLIS = 35L * 60L * 1000L;
4040
private static final long TWO_MINUTES_MILLIS = 2L * 60L * 1000L;
4141
private static final long CURRENT_TIME_MILLIS = 1000L;
4242

@@ -73,11 +73,14 @@ public void maybeScheduleTokenRefresh_useExpirationTimeFractionBuffer() {
7373
tokenRefreshManager.onListenerCountChanged(/* newListenerCount= */ 1);
7474
tokenRefreshManager.maybeScheduleTokenRefresh(expiresInOneHourToken);
7575

76-
verify(mockTokenRefresher).scheduleRefresh(NINE_TENTHS_HOUR_MILLIS);
76+
verify(mockTokenRefresher).scheduleRefresh(THIRTY_FIVE_MINUTES_MILLIS);
7777
}
7878

7979
@Test
8080
public void maybeScheduleTokenRefresh_useExpirationTimeAbsoluteBuffer() {
81+
// This should not occur, as the minimum TTL should be at least 15 minutes, but this test case
82+
// checks to make sure that in the case we receive a shorter-than-expected TTL from the backend,
83+
// we handle it gracefully.
8184
DefaultAppCheckToken expiresInThreeMinutesToken =
8285
new DefaultAppCheckToken(
8386
TOKEN_PAYLOAD, EXPIRE_IN_THREE_MINUTES_MILLIS, mockClock.currentTimeMillis());

0 commit comments

Comments
 (0)