Skip to content

Fix refresh logic for App Check custom providers. #3582

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ public final class DefaultAppCheckToken extends AppCheckToken {
@VisibleForTesting static final String ISSUED_AT_KEY = "iat";
@VisibleForTesting static final String EXPIRATION_TIME_KEY = "exp";

private static final long ONE_SECOND_MILLIS = 1000L;

// Raw token value
private final String token;
// Timestamp in MS at which this token was generated
Expand Down Expand Up @@ -79,7 +81,7 @@ public static DefaultAppCheckToken constructFromAppCheckTokenResponse(
TokenParser.parseTokenClaims(tokenResponse.getAttestationToken());
long iat = getLongFromClaimsSafely(claimsMap, ISSUED_AT_KEY);
long exp = getLongFromClaimsSafely(claimsMap, EXPIRATION_TIME_KEY);
expiresInMillis = exp - iat;
expiresInMillis = (exp - iat) * ONE_SECOND_MILLIS;
}

return new DefaultAppCheckToken(tokenResponse.getAttestationToken(), expiresInMillis);
Expand Down Expand Up @@ -138,10 +140,10 @@ public static DefaultAppCheckToken constructFromRawToken(@NonNull String token)
Map<String, Object> claimsMap = TokenParser.parseTokenClaims(token);
long iat = getLongFromClaimsSafely(claimsMap, ISSUED_AT_KEY);
long exp = getLongFromClaimsSafely(claimsMap, EXPIRATION_TIME_KEY);
long expiresInMillis = exp - iat;
long expiresInMillis = (exp - iat) * ONE_SECOND_MILLIS;
// We use iat for receivedAtTimestamp as an approximation since we have to guess for raw JWTs
// that we recovered from storage
return new DefaultAppCheckToken(token, expiresInMillis, iat);
return new DefaultAppCheckToken(token, expiresInMillis, iat * ONE_SECOND_MILLIS);
}

private static long getLongFromClaimsSafely(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public class DefaultAppCheckTokenTest {
private static final String INVALID_TIME_TO_LIVE = "notanumber";
private static final long EXPIRES_IN_ONE_HOUR = 60L * 60L * 1000L; // 1 hour in millis
private static final long RECEIVED_AT_TIMESTAMP = 1L;
private static final long ONE_SECOND_MILLIS = 1000L;
private static final long IAT = 10L;
private static final long EXP = 30L;
private static final String TOKEN_PREFIX = "prefix";
Expand Down Expand Up @@ -104,8 +105,9 @@ public void testConstructFromRawToken_normalToken_expectSuccess() throws Excepti

assertThat(defaultAppCheckToken).isNotNull();
assertThat(defaultAppCheckToken.getToken()).isEqualTo(rawToken);
assertThat(defaultAppCheckToken.getReceivedAtTimestamp()).isEqualTo(IAT);
assertThat(defaultAppCheckToken.getExpiresInMillis()).isEqualTo(EXP - IAT);
assertThat(defaultAppCheckToken.getReceivedAtTimestamp()).isEqualTo(IAT * ONE_SECOND_MILLIS);
assertThat(defaultAppCheckToken.getExpiresInMillis())
.isEqualTo((EXP - IAT) * ONE_SECOND_MILLIS);
}

@Test
Expand Down Expand Up @@ -143,7 +145,8 @@ public void testConstructFromAppCheckTokenResponse_invalidTimeToLiveFormat_fallb
DefaultAppCheckToken.constructFromAppCheckTokenResponse(mockAppCheckTokenResponse);

assertThat(defaultAppCheckToken.getToken()).isEqualTo(rawToken);
assertThat(defaultAppCheckToken.getExpiresInMillis()).isEqualTo(EXP - IAT);
assertThat(defaultAppCheckToken.getExpiresInMillis())
.isEqualTo((EXP - IAT) * ONE_SECOND_MILLIS);
}

private String constructFakeRawToken() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public class StorageHelperTest {
private static final long RECEIVED_AT_TIMESTAMP = 10L;
private static final long IAT = 10L;
private static final long EXP = 30L;
private static final long ONE_SECOND_MILLIS = 1000L;
private static final String TOKEN_PREFIX = "prefix";
private static final String TOKEN_SUFFIX = "suffix";
private static final String SEPARATOR = ".";
Expand Down Expand Up @@ -108,8 +109,8 @@ public void testSaveAndRetrieveToken_TestAppCheckToken_expectEquivalentToken() t
(DefaultAppCheckToken) storageHelper.retrieveAppCheckToken();
assertThat(retrievedToken).isNotNull();
assertThat(retrievedToken.getToken()).isEqualTo(rawToken);
assertThat(retrievedToken.getExpiresInMillis()).isEqualTo(EXP - IAT);
assertThat(retrievedToken.getReceivedAtTimestamp()).isEqualTo(IAT);
assertThat(retrievedToken.getExpiresInMillis()).isEqualTo((EXP - IAT) * ONE_SECOND_MILLIS);
assertThat(retrievedToken.getReceivedAtTimestamp()).isEqualTo(IAT * ONE_SECOND_MILLIS);
}

@Test
Expand Down