Как я должен/мог бы хранить свои токены JWT в Redis, чтобы видеть текущие сеансы пользователей?

Я использую Java с Spring для создания API для отдыха вместе с парой других сервисов.

Основная функциональность заключается в создании/входе пользователей. Я знаю, что в redis нет языка запросов, поэтому я публикую вопрос здесь! Есть ли какая-то библиотека на Java, которая позволяет нам выполнять запросы к Redis? В моем случае получить все текущие токены jwt (сеансы), назначенные пользователю (userId)?

Я думал о реализации сам, но думаю, что это немного чрезмерно и неуклюже?

  1. Я бы использовал userId в качестве ключа
  2. Затем я бы сохранил хэш-карту токенов JWT внутри раздела значений.

Пример

  1. Вход пользователя
  2. Мы создаем JWT
  3. Мы создаем хэш-карту, а затем добавляем JWT
  4. Затем мы назначаем хэш-карту в виде массива байтов ключу Redis (userId).
  5. Мы бы сохранили ключ+значение redis

Если тот же пользователь войдет в систему, мне придется пройти еще раз и сделать следующее:

  1. Создать JWT
  2. Поиск существующих ключей Redis с идентификатором пользователя
  3. Затем мы приводили найденное значение к нашему исходному объекту JWT.
  4. Затем мы добавляем в хэш-карту еще один объект JWT.
  5. Сохраните ключ+значение

Это означает, что при каждом запросе к защищенным конечным точкам 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.");

person James111    schedule 10.08.2016    source источник
comment
Собираетесь ли вы отправлять userId вместе с JWT в каждом API?   -  person navaltiger    schedule 20.09.2016
comment
Да @navaltiger   -  person James111    schedule 20.09.2016


Ответы (1)


Вы можете использовать JWT для своего API, выполнив следующие действия:

  1. Логин пользователя -> создать JWT с истечением срока действия.
  2. Выход пользователя-> сохранить неверный токен в Redis.
  3. Когда пользователь вызывает api -> вы проверяете JWT:

    • If valid token and not in Redis invalid tokens => authentication
    • Если они недействительны или принадлежат недействительным токенам Redis => неаутентификация
  4. Если вы хотите получить зарегистрированных пользователей, вы можете сохранить зарегистрированного пользователя в Redis при входе пользователя в систему.

person Quoc Dat    schedule 17.08.2016
comment
Если я вас правильно понял, сохранение всех недействительных токенов — пустая трата памяти. Использование функции TTL достаточно, чтобы получить контроль над действительными и недействительными токенами путем истечения их срока действия через определенное количество время (в зависимости от варианта использования и уровня безопасности). - person Dez; 18.06.2018