Я использую Java с Spring для создания API для отдыха вместе с парой других сервисов.
Основная функциональность заключается в создании/входе пользователей. Я знаю, что в redis нет языка запросов, поэтому я публикую вопрос здесь! Есть ли какая-то библиотека на Java, которая позволяет нам выполнять запросы к Redis? В моем случае получить все текущие токены jwt (сеансы), назначенные пользователю (userId)?
Я думал о реализации сам, но думаю, что это немного чрезмерно и неуклюже?
- Я бы использовал userId в качестве ключа
- Затем я бы сохранил хэш-карту токенов JWT внутри раздела значений.
Пример
- Вход пользователя
- Мы создаем JWT
- Мы создаем хэш-карту, а затем добавляем JWT
- Затем мы назначаем хэш-карту в виде массива байтов ключу Redis (userId).
- Мы бы сохранили ключ+значение redis
Если тот же пользователь войдет в систему, мне придется пройти еще раз и сделать следующее:
- Создать JWT
- Поиск существующих ключей Redis с идентификатором пользователя
- Затем мы приводили найденное значение к нашему исходному объекту JWT.
- Затем мы добавляем в хэш-карту еще один объект JWT.
- Сохраните ключ+значение
Это означает, что при каждом запросе к защищенным конечным точкам API мне придется выполнять поиск по идентификатору пользователя, десериализовать хэш-карту, прокручивать хэш-карту и пытаться сопоставить JWT, который был отправлен в заголовке. Кажется, это много работы? Есть ли другой способ сделать это?
Если бы пользователь хотел выйти из системы, процесс был бы очень похож на повторный вход, за исключением пункта 4., я бы удалил JWT из хэш-карты, а затем сохранил Это.
На данный момент я просто сохраняю токен JWT в качестве ключа и выполняю простой jedis.get(RequestHeader.JWT) на защищенных конечных точках API. Если бы был способ запроса значения, а не ключа, то это было бы идеально, так как я мог бы просто сохранить ключ как JWT и userId как значение.
Вот так:
final String token = authHeader.substring(7); // The part after "Bearer "
try {
final Claims claims = Jwts.parser().setSigningKey("${secret}")
.parseClaimsJws(token).getBody();
request.setAttribute("claims", claims);
request.setAttribute("token", token);
} catch (final SignatureException e) { throw new ServletException("Invalid token."); }
if (redisClient.get(token) == null) throw new ServletException("Invalid or expired token.");