如何使用 MQTT 处理 JWT 撤销

Posted

技术标签:

【中文标题】如何使用 MQTT 处理 JWT 撤销【英文标题】:How to handle JWT revocation with MQTT 【发布时间】:2018-04-29 02:04:41 【问题描述】:

按照this Auth0 article 中的说明,我使用“JWT”作为用户名并使用 JWT 令牌作为密码成功验证了 MQTT 客户端。

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

我的问题是:如何实现令牌更新?它是来自客户端的发布消息吗?到哪个话题?我是否断开客户端,并让客户端使用新令牌重新进行身份验证?还是有别的办法?

【问题讨论】:

【参考方案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);

【讨论】:

断开/连接是最好的方法吗?无法保持通道畅通? @ArthurC 为了在 MQTT 代理中进行身份验证流程,除了断开/连接客户端之外没有其他方法。【参考方案2】:

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

根据您使用的系统,您可以将此功能添加到您使用的 Message Broker。

例如,在 HiveMQ 中,您可以轻松地插入一个异步回调,它会安排此类后台作业并定期执行。

HiveMQ 的扩展系统有很好的文档记录,您可以在这里找到一些示例:https://www.hivemq.com/docs/4/extensions/services.html#managed-extension-executor

【讨论】:

客户端如何处理令牌刷新?

以上是关于如何使用 MQTT 处理 JWT 撤销的主要内容,如果未能解决你的问题,请参考以下文章

如何撤销 JWT 令牌?

如何以管理员用户身份撤销用户的访问令牌和刷新令牌?在 Oauth2 中使用 JWT

如何在 express.js/passport-http-bearer 中撤销 express-jwt 令牌

与黑名单撤销功能一起使用时,Express-jwt 未设置 req.user

如何在spring oauth使用redis令牌存储中获取jwt令牌的解码详细信息

如何使用 JWT 处理更改的权限