emqx MQTT 通过JWT鉴权的话怎么判断是否过期的问题

MQTT emqx通过JWT 认证鉴权的话怎么判断是否过期的问题
RT,现在token过期后如果连接没有断开仍然能够继续发送或者接收消息。目前在控制界面acl那里不知道怎么写,官网上只有一些简单的案例,通过用户名和主题来判断。我现在需要通过token的过期时间来判断。

MQTT Broker 鉴权时,如果采用 JWT 认证方式,可以借助 JWT Token 的 exp 字段,即过期时间戳来判断 Token 是否过期。以下是代码示例:

import jwt
import time

# 解析 JWT Token
def parse_jwt_token(token, secret):
    return jwt.decode(token, secret, algorithms=['HS256'])

# 验证 JWT Token 是否过期
def is_jwt_token_expired(token):
    if 'exp' in token:
        now = int(time.time())
        return token['exp'] < now
    else:
        return False

# 验证 MQTT 订阅发布权限
def is_mqtt_allowed(token, topic, permission):
    # TODO: 根据 token 中的 payload 和 expiration 进行验证,这里只是示例
    return token['sub'] == 'user123' and topic.startswith('users/user123')

# 使用示例
token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1NzgxODQ0OTksInVzZXJuYW1lIjoidXNlcjEyMzQifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
secret = 'mysecretkey'

# 解析 Token 中的 payload
token_payload = parse_jwt_token(token, secret)

# 判断 Token 是否过期
if is_jwt_token_expired(token_payload):
    print("JWT Token 已过期")
else:
    print("JWT Token 未过期")

# 验证 MQTT 订阅发布权限
if is_mqtt_allowed(token_payload, 'users/user123/#', 'read'):
    print("用户 user123 允许订阅主题 users/user123/#")
else:
    print("用户 user123 不允许订阅主题 users/user123/#")

这里的 parse_jwt_token() 方法是解析 JWT Token 的函数,此处需要提供 JWT Token 和加密密钥进行解码。is_jwt_token_expired() 方法是判断 JWT Token 是否过期的函数,此处判断 Token 中的过期时间 exp 是否小于当前时间戳。is_mqtt_allowed() 方法是验证用户是否有 MQTT 订阅发布权限的函数,此处可以通过解析 JWT Token 的 payload 字段,结合过期时间的判断,来完成权限验证的逻辑。

对于通过JWT鉴权的EMQ X MQTT客户端,通常需要实现Token的过期策略,以保证安全。JWT Token可以设置一个过期时间,在过期时间之前可以正常访问,而在过期时间之后,就需要重新获取新的Token。
实现Token的过期策略可以通过在服务端生成Token时,在JWT Claim中加入一个过期时间戳。这样,当客户端在调用EMQ X MQTT Broker时会自动携带JWT Token,在服务端会对JWT Token进行验证,并检查Token中的过期时间戳。如果当前时间戳大于Token中的过期时间戳,则认为该Token已过期,之后就不会再次通过验证。
在EMQ X MQTT Broker的配置文件中,可以设置JWT Token的过期时间(默认为1小时),例如:

## JWT 认证配置
## 激活 JWT 鉴权
auth.jwt.enabled = true
 ## JWT 签名密钥(签名算法是RS256)
auth.jwt.secret = emqx_secret
 ## JWT Token 过期时间 (单位秒)
auth.jwt.expire = 3600

在上述示例中,auth.jwt.expire表示JWT Token的过期时间为1小时。可以根据实际情况来进行设置,建议设置一个较短的过期时间,以提高安全性。