Проверка срока действия токена - PullRequest
0 голосов
/ 13 июля 2020

Я хочу проверить срок действия моего токена, и когда я написал код и перезапустил сервер, секретный ключ изменился. По этой причине мои тесты всегда терпят неудачу. Как я могу это исправить?

Вот мой isExpired и его вспомогательный метод:

final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256); //This key always
// change if i restart server
.
.
.
public boolean isExpired(String token) {
    Claims claims = getClaims(token);
    return claims.getExpiration().after(new Date(System.currentTimeMillis()));
}

private Claims getClaims(String token) {
    return Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
}

1 Ответ

1 голос
/ 14 июля 2020

К сожалению, вы не предоставили никакой информации о библиотеке, которую вы используете для генерации Key. По API, я думаю, это этот ?

Как написано в do c, вы можете понять, почему вы получаете еще один ключ каждый раз, когда запускаете свой test.

Под капотом JJWT использует KeyGenerator поставщика JCA для создания безопасного случайного ключа с правильной минимальной длиной для данного алгоритма.

Итак, это нормальное поведение библиотеки для генерации нового случайного Key каждый раз, когда вызывается Keys.secretKeyFor.

Помимо этой общей информации существует также решение вашей проблемы:

Если вам нужно сохранить этот новый SecretKey, вы можете кодировать его в Base64 (или Base64URL):

String secretString = Encoders.BASE64.encode(key.getEncoded());

Если вы хотите использовать один и тот же Key при каждом запуске тестов, вам следует десериализовать та же строка Base64 перед каждым тестом. Для десериализации вы можете использовать Base64Decoder и передать byte[] в SecretKey.hmacShaKeyFor -Method. Ваш код должен выглядеть примерно так.

byte[] decodedKey = Decoders.BASE64.decode("Your_Base64_key");
SecretKey key = SecretKey.hmacShaKeyFor(decodedKey);

Я бы посоветовал вам сохранить кодированный в Base64 Secret в папке ресурсов вашего тестового источника root.

Также я бы порекомендовал вам передать текущую дату в ваш isExpired -Метод, потому что в противном случае ваши тесты зависят от текущего времени системы. Вы должны попытаться исключить все динамические c вещи в своем модульном тесте. В противном случае они станут хрупкими и начнут «случайным образом» выходить из строя.

...