按照this Auth0 article中的说明,我使用" JWT"成功验证了MQTT客户端。作为用户名,JWT令牌作为密码。
然而,在我的用例中,JWT令牌是短暂的。客户端必须在当前令牌的到期日期之前获取新令牌,然后将其提供给MQTT服务器。否则,服务器终止连接。
我的问题是:如何实施令牌更新?它是来自客户的发布消息吗?哪个主题?我是否断开客户端连接,并让客户端使用新令牌重新进行身份验证?或者还有另一种方式吗?
答案 0 :(得分:4)
最简单的方法是实现异步服务,该服务定期检查您连接的客户端并读取令牌时间戳。 如果时间戳记过旧,请强制断开客户端连接,然后重新连接。
根据您使用的系统,可以将此功能添加到您使用的Message Broker中。
例如,在HiveMQ中,您可以轻松地插入异步回调,以安排此类后台作业并定期执行。
HiveMQ的扩展系统已有详细文档,您可以在此处找到一些示例:https://www.hivemq.com/docs/4/extensions/services.html#managed-extension-executor
答案 1 :(得分: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);
}