Siguiendo las instrucciones de este artículo de Auth0, he autenticado correctamente a los clientes de MQTT mediante " JWT "como nombre de usuario y el token JWT como contraseña.

En mi caso de uso, sin embargo, los tokens JWT son de corta duración. Los clientes deben obtener un nuevo token antes de la fecha de vencimiento del token actual y luego proporcionarlo al servidor MQTT. De lo contrario, el servidor finaliza la conexión.

Mi pregunta es: ¿cómo implemento la actualización del token? ¿Es un mensaje de publicación del cliente? ¿A qué tema? ¿Desconecto el cliente y dejo que el cliente se vuelva a autenticar con el nuevo token? ¿O hay otra manera?

15
Arthur C 15 nov. 2017 a las 21:01

2 respuestas

La mejor respuesta

Considerar la actualización de los tokens JWT es importante porque los tokens tienen fechas de vencimiento. Si un dispositivo está conectado a través de MQTT y su token expira, el intermediario MQTT debería desconectar automáticamente el dispositivo del intermediario. Puede evitar que el dispositivo se desconecte actualizando automáticamente su token.

Los siguientes ejemplos ilustran cómo comprobar si un token ha caducado y, si lo ha hecho, cómo volver a conectarse con un nuevo token sin desconectar el dispositivo.

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);
}
1
Ruhollah Delpak 17 sep. 2019 a las 18:54

La forma más sencilla es implementar un servicio asincrónico, que verifica periódicamente a sus clientes conectados y lee la marca de tiempo del token. Si la marca de tiempo es demasiado antigua, fuerce la desconexión del cliente y vuelva a conectarse.

Dependiendo del sistema que use, puede agregar esta funcionalidad a su Message Broker que use.

En HiveMQ, por ejemplo, puede agregar fácilmente una devolución de llamada asincrónica, que programa este tipo de trabajo en segundo plano y lo ejecuta periódicamente.

El sistema de extensión de HiveMQ está bien documentado y puede encontrar algunos ejemplos aquí: https://www.hivemq.com/docs/4/extensions/services.html#managed-extension-executor

4
Anja H 29 ene. 2019 a las 13:07