add returnsNewToken for grace period check
This commit is contained in:
@@ -74,7 +74,7 @@ class TokenServiceTest {
|
|||||||
Duration.ofSeconds(10),
|
Duration.ofSeconds(10),
|
||||||
Duration.ofSeconds(10),
|
Duration.ofSeconds(10),
|
||||||
Duration.ofSeconds(10),
|
Duration.ofSeconds(10),
|
||||||
Duration.ofSeconds(10)
|
Duration.ofSeconds(5)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -323,5 +323,44 @@ class TokenServiceTest {
|
|||||||
TokenService.Rotation rotation = tokenService.rotate(rawToken);
|
TokenService.Rotation rotation = tokenService.rotate(rawToken);
|
||||||
assertNotEquals(rawToken, rotation.newRefreshToken());
|
assertNotEquals(rawToken, rotation.newRefreshToken());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Grace period checks
|
||||||
|
@Test
|
||||||
|
void usedWithinGrace_returnsNewToken() {
|
||||||
|
Instant usedAt = Instant.now(clock);
|
||||||
|
|
||||||
|
TokenFamily tokenFamily = new TokenFamily();
|
||||||
|
tokenFamily.setId(1L);
|
||||||
|
tokenFamily.setUser(createUser(1L, "user", "user"));
|
||||||
|
tokenFamily.setExpiresAt(usedAt.plusSeconds(10));
|
||||||
|
|
||||||
|
RefreshToken refreshToken = new RefreshToken();
|
||||||
|
refreshToken.setTokenHash(rawToken.getBytes());
|
||||||
|
refreshToken.setTokenFamily(tokenFamily);
|
||||||
|
refreshToken.setExpiresAt(usedAt.plusSeconds(10));
|
||||||
|
refreshToken.setUsedAt(usedAt);
|
||||||
|
|
||||||
|
when(refreshTokenRepository.findByHash(any()))
|
||||||
|
.thenReturn(Optional.of(refreshToken));
|
||||||
|
|
||||||
|
// within grace: 3s since usedAt, grace is 5s, and nothing has expired yet
|
||||||
|
clock.advance(Duration.ofSeconds(3));
|
||||||
|
|
||||||
|
TokenService.Rotation rotation = tokenService.rotate(rawToken);
|
||||||
|
|
||||||
|
assertEquals(1L, rotation.userId());
|
||||||
|
assertNotEquals(rawToken, rotation.newRefreshToken());
|
||||||
|
assertNull(tokenFamily.getRevokedAt());
|
||||||
|
verify(tokenFamilyRepository, never()).save(any());
|
||||||
|
|
||||||
|
// grace is not extended by a replay, and only the new token is written
|
||||||
|
assertEquals(usedAt, refreshToken.getUsedAt());
|
||||||
|
|
||||||
|
verify(refreshTokenRepository, times(1)).save(tokenCaptor.capture());
|
||||||
|
RefreshToken newToken = tokenCaptor.getValue();
|
||||||
|
assertNull(newToken.getUsedAt());
|
||||||
|
assertSame(tokenFamily, newToken.getTokenFamily());
|
||||||
|
assertNotEquals(refreshToken.getTokenHash(), newToken.getTokenHash());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user