Подтвердить что ты не робот

Как обрабатывать аннулирование JWT с помощью MQTT

Следуя инструкциям в этой статье Auth0, я успешно аутентифицировал клиентов MQTT, используя "JWT" в качестве имени пользователя и токена JWT в качестве пароля.

В моем случае использования, однако, токены JWT недолговечны. Клиенты должны получить новый токен до даты истечения срока действия текущего токена, а затем предоставить его на сервере MQTT. В противном случае соединение будет завершено сервером.

Мой вопрос: как реализовать обновление токена? Это сообщение публикации от клиента? На какую тему? Отключить ли клиент и позволить клиенту повторно аутентифицироваться с новым токеном? Или есть другой способ?

4b9b3361

Ответ 1

Обновление токенов JWT имеет значение, потому что токены имеют даты истечения срока действия. Если устройство подключено через MQTT и срок действия его токена истекает, брокер MQTT должен автоматически отключить устройство от брокера. Вы можете предотвратить отключение устройства, автоматически обновив его токен.

В следующих примерах показано, как проверить, не истек ли токен, и, если он есть, как восстановить соединение с новым токеном, не отключая устройство.

long secsSinceRefresh = ((new DateTime()).getMillis() - iat.getMillis()) / 1000;
if (secsSinceRefresh > (options.tokenExpMins * 60)) {
  System.out.format("\tRefreshing token after: %d seconds\n", secsSinceRefresh);
  iat = new DateTime();
  if (options.algorithm.equals("RS256")) {
    connectOptions.setPassword(
        createJwtRsa(options.projectId, options.privateKeyFile).toCharArray());
  } else if (options.algorithm.equals("ES256")) {
    connectOptions.setPassword(
        createJwtEs(options.projectId, options.privateKeyFile).toCharArray());
  } else {
    throw new IllegalArgumentException(
        "Invalid algorithm " + options.algorithm + ". Should be one of 'RS256' or 'ES256'.");
  }
  client.disconnect();
  client.connect();
  attachCallback(client, options.deviceId);
}

Ответ 2

Самый простой способ - внедрить асинхронную службу, которая периодически проверяет подключенных клиентов и считывает метку времени. Если временная метка устарела - принудительно отключите клиент и повторите подключение.

В зависимости от системы, которую вы используете, вы можете добавить эту функцию в свой брокер сообщений, который вы используете.

Например, в HiveMQ вы можете легко подключить асинхронный обратный вызов, который планирует фоновое задание такого рода и выполняет его периодически.

Система расширений HiveMQ хорошо документирована, и вы можете найти несколько примеров здесь: https://www.hivemq.com/docs/4/extensions/services.html#managed-extension-executor