Как обрабатывать отзыв JWT с помощью MQTT

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

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

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


person Arthur C    schedule 15.11.2017    source источник


Ответы (2)


Обновление токенов 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);
}
person Ruhollah Delpak    schedule 17.09.2019
comment
Является ли отключение / подключение лучшим способом? Нет возможности держать канал открытым? - person Arthur C; 24.09.2019
comment
@ArthurC Чтобы запустить процесс аутентификации в MQTT-брокере, нет другого способа, кроме отключения/подключения клиентов. - person Ruhollah Delpak; 24.09.2019

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

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

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

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

person Anja H    schedule 29.01.2019
comment
Как клиент будет обрабатывать обновление токена? - person Arthur C; 30.01.2019