Oauth 如何使用MQTT处理JWT撤销

Oauth 如何使用MQTT处理JWT撤销,oauth,jwt,mqtt,auth0,json-web-token,Oauth,Jwt,Mqtt,Auth0,Json Web Token,按照中的说明,我使用“JWT”作为用户名和JWT令牌作为密码成功地对MQTT客户机进行了身份验证 然而,在我的用例中,JWT令牌是短期的。客户端必须在当前令牌的过期日期之前获取新令牌,然后将其提供给MQTT服务器。否则,服务器将终止连接 我的问题是:如何实现令牌更新?它是来自客户端的发布消息吗?到哪一个话题?我是否断开客户端连接,让客户端使用新令牌重新验证?或者还有其他方法吗?最简单的方法是实现异步服务,该服务定期检查连接的客户端并读取令牌时间戳。 如果时间戳是旧的-强制断开客户端的连接,然后重

按照中的说明,我使用“JWT”作为用户名和JWT令牌作为密码成功地对MQTT客户机进行了身份验证

然而,在我的用例中,JWT令牌是短期的。客户端必须在当前令牌的过期日期之前获取新令牌,然后将其提供给MQTT服务器。否则,服务器将终止连接


我的问题是:如何实现令牌更新?它是来自客户端的发布消息吗?到哪一个话题?我是否断开客户端连接,让客户端使用新令牌重新验证?或者还有其他方法吗?

最简单的方法是实现异步服务,该服务定期检查连接的客户端并读取令牌时间戳。 如果时间戳是旧的-强制断开客户端的连接,然后重新连接

根据您使用的系统,您可以将此功能添加到您使用的MessageBroker中

例如,在HiveMQ中,您可以轻松插入异步回调,该回调调度此类后台作业并定期执行


HiveMQ的扩展系统有很好的文档记录,您可以在这里找到一些示例:

考虑刷新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);
}

客户端如何处理令牌刷新?断开/连接是最好的方法吗?不可能保持通道打开?@ArthurC为了在MQTT broker中流动身份验证过程,除了断开/连接客户端之外,没有其他方法。